我当前正在使用一个大型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是每个组中的行数(按ref1ref2分组)。

10-06 13:29