更新data.table中的向量

时间:2014-12-26 20:52:45

标签: r vector data.table

我有这个:

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)]

3 个答案:

答案 0 :(得分:5)

一种解决方法是使用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
              ...)]
    

    在作业中添加一些评论特别有用。

答案 1 :(得分: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))] 

无效。

BTW我也没有看到使用data.tables的重点。

答案 2 :(得分:0)

这有效:

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