我当前正在使用一个大型data.table,该表具有基于2个参考列的特定组,然后具有一列用于距离的列,该列是为每个组中的第一行定义的,然后每次跳转2个单位。
举一个非常小的可复制示例,我有:
reference1 <- c("ref1", "ref1", "ref1", "ref2", "ref2", "ref2", "ref2", "ref3", "ref3", "ref3")
reference2 <- c("fer1", "fer1", "fer1", "fer1", "fer1", "fer1", "fer1", "fer2", "fer2", "fer2")
firstdist <- c(2, NA, NA, 5, NA, NA, NA, 8, NA, NA)
df <- data.frame(ref1 = reference1,
ref2 = reference2,
dist = firstdist)
等于
ref1 ref2 dist
1 ref1 fer1 2
2 ref1 fer1 NA
3 ref1 fer1 NA
4 ref2 fer1 5
5 ref2 fer1 NA
6 ref2 fer1 NA
7 ref2 fer1 NA
8 ref3 fer2 8
9 ref3 fer2 NA
10 ref3 fer2 NA
我想填写该列,以获取最后的观察结果并将其前进+2,因此我假设我要为此使用Zoo包中的na.locf。到处搜寻我在添加常量整数的同时还没有发现任何结转方法。
我想要的输出示例:
ref1 ref2 dist
1 ref1 fer1 2
2 ref1 fer1 4
3 ref1 fer1 6
4 ref2 fer1 5
5 ref2 fer1 7
6 ref2 fer1 9
7 ref2 fer1 11
8 ref3 fer2 8
9 ref3 fer2 10
10 ref3 fer2 12
例如用类似的东西
df$dist <- na.locf(df$dist, by = 2)
并非100%肯定na.locf是执行此操作的最佳方法,因此也欢迎使用data.table解决方案,但是由于我的表有数百万行,因此效率也非常重要
谢谢,
最佳答案
我会尝试以下方法:
library(data.table)
setDT(df)
df[, dist := seq(first(dist), by = 2, length.out = .N), by = .(ref1, ref2)]
# > df
# ref1 ref2 dist
# 1: ref1 fer1 2
# 2: ref1 fer1 4
# 3: ref1 fer1 6
# 4: ref2 fer1 5
# 5: ref2 fer1 7
# 6: ref2 fer1 9
# 7: ref2 fer1 11
# 8: ref3 fer2 8
# 9: ref3 fer2 10
# 10: ref3 fer2 12
在这里,
.N
是每个组中的行数(按ref1
和ref2
分组)。