我目前正在使用一个大型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)
Run Code Online (Sandbox Code Playgroud)
相当于
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
Run Code Online (Sandbox Code Playgroud)
我想填写最后一个观察列并向前移动+2,所以我假设我想从动物园包中使用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
Run Code Online (Sandbox Code Playgroud)
例如,有类似的东西
df$dist <- na.locf(df$dist, by = 2)
Run Code Online (Sandbox Code Playgroud)
不是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
Run Code Online (Sandbox Code Playgroud)
这里.N是每个组中的行数(按ref1和分组ref2).