r - 是否有一种最佳方法可以使用 data.table 创建一堆新列?

标签 r data.table

我正在使用 data.table
我有一个新列的名称向量。我想创建这些新列,但使用旧列中的信息。
让我在下面的例子中展示它:

data <- data.table(a = c("OneA", "TwoB", "ThreeC"),
                   b = c(1, 2, 3))

newCols <- c("One", "Two", "Three")

for (newCol in newCols) {
  data[, eval(newCol) := gsub(paste0("^.*", newCol), "", a)]
}

作为输出,我期望(并得到)以下内容:
> data
        a   b    One    Two Three
1:   OneA   1      A   OneA  OneA
2:   TwoB   2   TwoB      B  TwoB
3: ThreeC   3 ThreeC ThreeC     C

在这种情况下,我结合从向量定义新列并使用向量值本身来填充这些列。有没有办法做得更优化(例如使用 set())?

最佳答案

其实,你在那里很近。只需将您的代码调整为:

for (newCol in newCols) {
  DT[, (newCol) := sub(newCol, "", a)]
}

并且您有一个既快速又高效的解决方案(比使用 lapply 更好)。

或者,您也可以在 for 循环中使用 set:
for (newCol in newCols) {
  set(DT, j = newCol, value = sub(newCol, "", DT[["a"]]))
}

那么为什么在这种情况下 for -loop 是更好的选择呢?
  • 使用 lapply,首先评估 := 的 RHS(右手瞄准具)。这意味着首先创建所有新列,并且必须首先在内存中分配和填充,然后添加到 data.tablefor -loop 方法更有效,因为它一次处理一列,因此只需要该一列的工作内存。
  • set:= 的低开销可循环版本。它对于通过引用(使用 for 循环)重复更新某些列的行特别有用。 set 消除了 [data.table 方法的小开销,因此速度更快。

  • 以上解释基于 Matt Dowle(this answer 的创建者)的 和帮助文件 ?set

    关于r - 是否有一种最佳方法可以使用 data.table 创建一堆新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59628979/

    相关文章:

    r - 从 node.js 调用 Rscript

    r - Data.table:与 j 一起使用的方括号

    r - I(x) := y and `:=` (I(x) = y) 之间差异的 data.table 错误

    r - 携带/使用上一组的值(value)

    r - 更快地计算每个时间步内所有个体之间的距离

    r - 在R中使用spplot在图上绘制多个shp文件

    r - 填充矩阵,其中子矩阵是 R 中向量(向量可以是随机数)中值的维度

    r - ConditionalPanel 不支持名称中带有点的变量,有什么解决办法吗?

    r - 从clValid-下标越界提取最佳成绩

    r - 是否有相当于 data.table::rleid 的 dplyr?