【问题标题】:Is there an optimal way to create a bunch of new columns with data.table?是否有一种最佳方法可以使用 data.table 创建一堆新列?
【发布时间】:2020-01-07 13:02:08
【问题描述】:

我正在使用 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())?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    一种可能的方法是:

    library(data.table)
    
    DT[, (newCols) := lapply(newCols, function(x) sub(x, "", a))][]
    #>         a b    One    Two Three
    #> 1:   OneA 1      A   OneA  OneA
    #> 2:   TwoB 2   TwoB      B  TwoB
    #> 3: ThreeC 3 ThreeC ThreeC     C
    

    数据

    DT <- data.table(a = c("OneA", "TwoB", "ThreeC"), b = c(1, 2, 3))
    newCols <- c("One", "Two", "Three")
    

    【讨论】:

      【解决方案2】:

      其实,你离得很近。只需将您的代码调整为:

      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 是更好的选择呢?

      1. 使用lapply,首先评估:= 的RHS(右手瞄准器)。这意味着首先创建所有新列,并且必须先在内存中分配和填充,然后再添加到data.tablefor-loop 方法效率更高,因为它一次只处理一列,因此只需要用于该一列的工作内存。
      2. set:= 的低开销循环版本。它对于通过引用(使用 for 循环)重复更新某些列的行特别有用。 set 消除了 [data.table 方法的少量开销,因此速度更快。

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

      【讨论】:

      • 谢谢!到目前为止,这是最适合我的解决方案
      • @gdol 我已经解释了为什么 for 循环是一个好的/更好的选择
      • @Jaap 好久没说话了。你最近怎么样?这是一个很好的提醒,以确认这两种方法之间的区别。我得刷新我的记忆。 dank je。
      【解决方案3】:

      使用Map()+cbind()的base R解决方案

      data <- as.data.table(c(data,`names<-`(Map(function(x) gsub(x,"",data$a),newCols),newCols)))
      

      这样

      > data
              a b    One    Two Three
      1:   OneA 1      A   OneA  OneA
      2:   TwoB 2   TwoB      B  TwoB
      3: ThreeC 3 ThreeC ThreeC     C
      

      【讨论】:

        猜你喜欢
        • 2011-02-16
        • 1970-01-01
        • 2012-08-21
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        相关资源
        最近更新 更多