【问题标题】:Update a vector in a data.table [duplicate]更新 data.table 中的向量 [重复]
【发布时间】:2014-12-26 20:52:44
【问题描述】:

我有这个:

dt = data.table(index=c(1,2), items=list(c(1,2,3),c(4,5)))
#   index items
#1:     1 1,2,3
#2:     2   4,5

我想将dt[index==2,items] 更改为c(6,7)

我试过了:

dt[index==2, items] = c(6,7)
dt[index==2, items := c(6,7)]

【问题讨论】:

    标签: r vector data.table


    【解决方案1】:

    一种解决方法是使用ifelse

     dt[,items:=ifelse(index==2,list(c(6,7)),items)]
    
       index items
    1:     1 1,2,3
    2:     2   6,7
    

    编辑正确答案:

     dt[index==2,items :=  list(list(c(6,7)))]
    

    确实,您还需要一个列表,因为 data.table 使用 list(.) 来查找要通过引用分配给列的值。


    data.table 中的:= 运算符有两种使用方式:

    1. LHS := RHS 形式:

      DT[, c("col1", "col2", ..) := list(val1, val2, ...)]
      

      它在 RHS 上需要一个 list() 参数。要添加列表列,您需要用另一个列表包装(如上图所示)。

    2. 函数形式:

      DT[, `:=`(col1 = val1, ## some comments
                col2 = val2, ## some more comments
                ...)]
      

      在作业中添加一些 cmets 尤其有用。

    【讨论】:

    • 为什么在 dt[index==2,items:=list(c(6,7))] 不起作用的情况下会起作用?
    • @pomber 我用正确的答案编辑我的答案。
    【解决方案2】:
    dt[index==2]$items[[1]] <- list(c(6,7))
    dt
    #    index items
    # 1:     1 1,2,3
    # 2:     2   6,7
    

    问题在于,按照您的设置方式,dt$items 是一个列表,而不是一个向量,因此您必须使用列表索引(例如,dt$items[[1]])。但是 AFAIK 你不能通过引用更新列表元素,所以,例如,

    dt[index==2,items[[1]]:=list(c(6,7))] 
    

    不会工作。

    顺便说一句,我也没有看到为此使用 data.tables 的意义。

    【讨论】:

    • 此列是更大数据表的一部分,我使用它主要是因为二进制搜索。
    【解决方案3】:

    这行得通:

    dt$items[[which(dt$index==2)]] = c(6,7)
    

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多