【问题标题】:Update an entire row in data.table in R在 R 中更新 data.table 中的一整行
【发布时间】:2015-04-15 09:33:25
【问题描述】:

我在 R 中有一个 data.table 对象,它有 9,000 列。我的代码一次计算所有 9,000 列的新值并返回一个值向量。我想一次用所有值替换 data.table 中的行。在 dataFrame 对象中,这很容易。但是,我不知道如何让它在 data.table 中工作。

d <- data.table(q=c(1,2,3,4,5,6,7,8,9), x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
d[q==1, := c(5,5,5,5)] # FAILS
d[q==1, ] <- c(5,5,5,5) # FAILS

知道如何一次有效地更新整行吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以将names(d) 用于LHS,然后使用as.list 将您的向量转换为列表,以便data.table 了解它需要将每个 值分配给不同列而不是所有列的值到每个列。

    您还在此处将character 向量转换为numericx 列),因此data.table 将返回警告以确保您知道这一点。

    vec <- c(5, 5, 5, 5)
    d[q == 1L, names(d) := as.list(vec)][]
    #    q x y v
    # 1: 5 5 5 5
    # 2: 2 a 3 2
    # 3: 3 a 6 3
    # 4: 4 b 1 4
    # 5: 5 b 3 5
    # 6: 6 b 6 6
    # 7: 7 c 1 7
    # 8: 8 c 3 8
    # 9: 9 c 6 9
    

    【讨论】:

      【解决方案2】:

      这也可以使用set 来完成,例如上面的示例(按行号引用)。

      set(d, 1L, names(d), as.list(vec))
      

      可能改为使用set 获得一些速度,但如果您需要先检索行号,则会失去一些优势。

      # Create large data table
      DT = data.table(col1 = 1:1e5)
      cols = paste0('col', 1:9e3)
      for (col in cols){ DT[, (col) := 1:1e5] }
      vec <- rep(5,9e3)
      
      # Test options
      microbenchmark(
        row_idnx <- DT[,.I[col1 == 1L]], # Retrieve row number
        set(DT, row_idnx, names(DT), as.list(vec)),
        DT[col1 == 1L, names(DT) := as.list(vec)]
      )
      
      Unit: microseconds
                                                expr      min        lq      mean    median        uq       max neval
                    row_idnx <- DT[, .I[col1 == 1L]] 1255.430 1969.5630 2168.9744 2129.2635 2302.1000  3269.947   100
          set(DT, row_idnx, names(DT), as.list(vec))  171.606  207.3235  323.7642  236.6765  274.6515  7725.120   100
       DT[col1 == 1L, `:=`(names(DT), as.list(vec))] 2761.289 2998.3750 3361.7842 3155.8165 3444.6310 13473.081   100
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        相关资源
        最近更新 更多