gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:21:17 25 4
gpt4 key购买 nike

我正在使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com