我正在使用 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.table
。 for
-loop 方法更有效,因为它一次处理一列,因此只需要该一列的工作内存。 set
是 :=
的低开销可循环版本。它对于通过引用(使用 for 循环)重复更新某些列的行特别有用。 set
消除了 [data.table
方法的小开销,因此速度更快。 以上解释基于 Matt Dowle(this answer 的创建者)的 data.table 和帮助文件
?set
。
关于r - 是否有一种最佳方法可以使用 data.table 创建一堆新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59628979/