带有seq的na.locf在R中的大列中

Rob*_*man 2 r zoo data.table

我目前正在使用一个大型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解决方案也欢迎,但由于我的表有数百万行,效率也相当重要

谢谢,

mt1*_*022 6

我会尝试以下方法:

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).