Tengo un problema ahora mismo. la columna que estoy tratando de manipular se ve así:

> DT <- data.table(Group= c("SM", NA, NA, NA, NA, NA, "GH", NA, NA, NA, NA, NA, NA, NA))
> DT
    Group
 1:    SM
 2:  <NA>
 3:  <NA>
 4:  <NA>
 5:  <NA>
 6:  <NA>
 7:    GH
 8:  <NA>
 9:  <NA>
10:  <NA>
11:  <NA>
12:  <NA>
13:  <NA>
14:  <NA>

Quiero llenar los NA con el valor anterior, pero solo para una cantidad específica de filas, en este caso solo 4, lo que significa que el resultado deseado es:

    Group
 1:    SM
 2:    SM
 3:    SM
 4:    SM
 5:    SM
 6:  <NA>
 7:    GH
 8:    GH
 9:    GH
10:    GH
11:    GH
12:  <NA>
13:  <NA>
14:  <NA>

¿Cómo puedo conseguir esto? Intenté con na.locf () pero no está haciendo lo que quiero que haga. gracias por adelantado

2
AahuM 9 sep. 2018 a las 16:36

3 respuestas

La mejor respuesta

Aquí hay una manera de hacerlo:

> DT[, Group := ifelse(seq_len(.N) <= 1 + 4, Group[1], Group),by = cumsum(!is.na(Group))]
> DT
    Group
 1:    SM
 2:    SM
 3:    SM
 4:    SM
 5:    SM
 6:  <NA>
 7:    GH
 8:    GH
 9:    GH
10:    GH
11:    GH
12:  <NA>
13:  <NA>
14:  <NA>
2
mt1022 9 sep. 2018 a las 13:44

Aquí hay una solución usando el paquete dplyr.

library(dplyr)
library(data.table)

# Set the threshold
threshold <- 4

DT2 <- DT %>%
  mutate(Group_ID = cumsum(!is.na(Group))) %>%
  group_by(Group_ID) %>%
  mutate(ID = row_number() - 1) %>%
  mutate(Group = ifelse(ID <= threshold, first(Group), NA_character_)) %>%
  ungroup() %>%
  select(Group)
DT2
# # A tibble: 14 x 1
#    Group
#    <chr>
#  1 SM   
#  2 SM   
#  3 SM   
#  4 SM   
#  5 SM   
#  6 NA   
#  7 GH   
#  8 GH   
#  9 GH   
# 10 GH   
# 11 GH   
# 12 NA   
# 13 NA   
# 14 NA  
3
www 9 sep. 2018 a las 13:47

Una opción con data.table sería

library(data.table)
DT[,  Group := Group[1][NA^(seq_len(.N) > 5)], cumsum(!is.na(Group))]
DT
#    Group
# 1:    SM
# 2:    SM
# 3:    SM
# 4:    SM
# 5:    SM
# 6:  <NA>
# 7:    GH
# 8:    GH
# 9:    GH
#10:    GH
#11:    GH
#12:  <NA>
#13:  <NA>
#14:  <NA>
3
akrun 9 sep. 2018 a las 17:44