我有一个相当大的数据帧(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)]
但由于尺寸原因,我的电脑无法处理,因此解决方案必须高效。
非常感谢任何帮助。
答案 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