根据R中的规则在数据帧中填充NA

时间:2017-05-20 21:42:24

标签: r

让我有这样一个数据框(df):

date           x     y
01-01-2016    43    14
02-01-2016    32    NA
03-01-2016    42    NA
04-01-2016    35    19
05-01-2016    45    NA
06-01-2016    65    NA
07-01-2016    39    NA
08-01-2016    39    24

我想在上面的数据框(df)中添加两个新的列(z1和z2)

date           x     y    z1     z2
01-01-2016    43    14    14     14
02-01-2016    32    NA    14     19 
03-01-2016    42    NA    14     19
04-01-2016    35    19    19     19
05-01-2016    45    NA    19     24
06-01-2016    65    NA    19     24
07-01-2016    39    NA    19     24
08-01-2016    39    24    24     24

z1规则如下:

  • 如果y_t不是NA z1_t = y_t
  • 如果y_t是NA,则z1_t等于最近的非NA的前一个y值。

z2规则如下:

  • 如果y_t不是NA z2_t = y_t
  • 如果y_t是NA,则z2_t等于不是NA的最接近的y的未来值。

我怎样才能在R中这样做?我会很高兴得到任何帮助。非常感谢。

1 个答案:

答案 0 :(得分:7)

您需要前向填充(z1)和后向填充(z2);您可以使用zoo::na.locf指定fromLast参数执行此操作,文档如下:

  

逻辑。导致观察结果反过来   比前进。默认值为FALSE。值为TRUE时,这对应   到NOCB(接下来的观察结果)

library(zoo)
df$z1 <- na.locf(df$y, fromLast = FALSE)
df$z2 <- na.locf(df$y, fromLast = TRUE)
df
#        data  x  y z1 z2
#1 01-01-2016 43 14 14 14
#2 02-01-2016 32 NA 14 19
#3 03-01-2016 42 NA 14 19
#4 04-01-2016 35 19 19 19
#5 05-01-2016 45 NA 19 24
#6 06-01-2016 65 NA 19 24
#7 07-01-2016 39 NA 19 24
#8 08-01-2016 39 24 24 24

tidyverse方法,fill功能,您可以在其中指定direction上/下:

library(tidyverse)
df %>% 
    mutate(z1 = y, z2 = y) %>% 
    fill(z1, .direction = "down") %>% 
    fill(z2, .direction = "up")

#        data  x  y z1 z2
#1 01-01-2016 43 14 14 14
#2 02-01-2016 32 NA 14 19
#3 03-01-2016 42 NA 14 19
#4 04-01-2016 35 19 19 19
#5 05-01-2016 45 NA 19 24
#6 06-01-2016 65 NA 19 24
#7 07-01-2016 39 NA 19 24
#8 08-01-2016 39 24 24 24