按分组ID和日期有效填写缺失值

时间:2017-10-16 12:06:00

标签: r dataframe dplyr data.table

我有一个相当大的数据帧(70k乘900),其中包含ID,日期和~900个代码列。地方缺少代码,我正在尝试填写这些缺失值。

规则是,对于每个包含未在以后日期记录的代码的ID,应该结转。

我已将数据帧转换为宽格式(假设这是将值降低的最简单方法)。

参见示例df:

df <- as.data.frame(list(
id = c('p1', 'p1', 'p1', 'p2', 'p2', 'p2'),
date = as.Date(1:6, origin=Sys.Date()),
code_1 = c('c_1', NA, NA, 'c_1', NA, NA),
code_2 = c(NA, 'c_2', NA, NA, NA, NA),
code_3 = c(NA, NA, 'c_3', NA, NA, NA)))

我想返回类似以下的内容,其中代码连续填充:

df2 <- as.data.frame(list(
id = c('p1', 'p1', 'p1', 'p2', 'p2', 'p2'),
date = as.Date(1:6, origin=Sys.Date()),
code_1 = c('c_1', 'c_1', 'c_1', 'c_1', 'c_1', 'c_1'),
code_2 = c(NA, 'c_2', 'c_2', NA, NA, NA),
code_3 = c(NA, NA, 'c_3', NA, NA, NA)))

我尝试了以下内容:

df[, lapply(FUN = na.locf, na.rm = FALSE), by = .(id)]

但由于尺寸原因,我的电脑无法处理,因此解决方案必须高效。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用fill中的tidyr

library(dplyr)
library(tidyr)
df %>%
  group_by(id) %>%
  fill(code_1:code_3)

<强>结果:

# A tibble: 6 x 5
# Groups:   id [2]
      id       date code_1 code_2 code_3
  <fctr>     <date> <fctr> <fctr> <fctr>
1     p1 2017-10-17    c_1     NA     NA
2     p1 2017-10-18    c_1    c_2     NA
3     p1 2017-10-19    c_1    c_2    c_3
4     p2 2017-10-20    c_1     NA     NA
5     p2 2017-10-21    c_1     NA     NA
6     p2 2017-10-22    c_1     NA     NA
相关问题