首页 > 解决方案 > 如何取 2 列生成长度为 N 的序列并添加为 R 中的列?

问题描述

我有一个数据框,最小和最大 2 列。我想为每一行生成这些数字的序列。

df <- data.table("ID"=c("A","B","C"),
                 "mn" = c(1,2,3),
                 "mx" = c(10,5,10)
                 )
> df
    ID mn mx
 1:  A  1  10
 2:  B  2  5
 3:  C  3  10

我想取这 2 列并为每行生成 4 个序列号

>df
 ID | mn | mx | S1 | s2    | S3 |  s4
  A    1   10    1     4     7      10
  B    2   5     2     3     4      5
  C    3   10    3     5.33  7.66   10 

我可以遍历行并使用 seq(mn, mx, length=N) 但我想将此操作应用于 100 万行,请提出有效的解决方案。

标签: rdata.tablesequence

解决方案


另一个使用 which 的矢量化选项data.table应该更快,而无需逐行遍历:

df[, paste0("s", 1L:4L) := {
        d <- (mx - mn) / 3
        .(mn, mn + d, mn + 2*d, mx)
    }]

概括地说,thelatemail 建议:

N <- 4L
df[, paste0("s", seq(N)) := transpose(Map(`+`, mn, 
    lapply((mx - mn) / (N-1), `*`, seq(0, N-1))
))]

或者等效但更长的时间,但我认为它会更快:

N <- 4L #assuming N >= 2
d <- df[, (mx - mn) / (N - 1)]
init <- df[["mn"]]
for (n in 1L:N) {
    set(df, j=paste0("s", n), value=init + (n-1) * d)
}

推荐阅读