我有这个:
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)]
答案 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
运算符的方法有两种:
LHS:= RHS表格:
DT[, c("col1", "col2", ..) := list(val1, val2, ...)]
RHS需要list()
个参数。要添加列表列,您需要使用另一个列表进行换行(如上所示)。
功能形式:
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)