我正在尝试做类似但与此处描述的不同的事情: Update subset of data.table based on join
具体来说,我想从表控件中分配匹配的键值(person_id
是两个表中的键)列值。 CI
是列索引。以下声明显示'with=F' was not used
。当我删除这些部分时,它也无法按预期工作。有什么建议吗?
重新说明:我想设置与控制FROM控件相对应的flatData子集。
flatData[J(eval(control$person_id)), ci, with=F] = control[, ci, with=F]
使用经典R:
给出一个可重现的例子x = data.frame(a = 1:3, b = 1:3, key = c('a', 'b', 'c'))
y = data.frame(a = c(2, 5), b = c(11, 2), key = c('a', 'b'))
colidx = match(c('a', 'b'), colnames(y))
x[x$key %in% y$key, colidx] = y[, colidx]
顺便说一句,有人请解释如何在不使用索引的情况下轻松分配SETS列!指数和data.table是在地狱里结婚。
答案 0 :(得分:2)
您可以同时使用:=
运算符和连接,如下所示:
首先准备数据:
require(data.table) ## >= 1.9.0
setDT(x) ## converts DF to DT by reference
setDT(y)
setkey(x, key) ## set key column
setkey(y, key)
现在是单行:
x[y, c("a", "b") := list(i.a, i.b)]
:=
通过引用修改(就地)。要修改的行由i
中的连接计算的索引提供。
i.a
和i.b
是内部生成的列名data.table
,可在i
和x
时轻松访问i
列在执行表单x[i]
的连接时具有相同的列名。
HTH
PS:在您的示例y
的列中,a和b的类型为numeric,x
的类型为整数,因此在运行数据时会收到警告,类型相匹配,因此必须进行强制。