我正在尝试做一些与此处描述的类似但又足够不同的事情: Update subset of data.table based on join
具体来说,我想将表控件中的列值分配给匹配的键值(person_id
是两个表中的键)。 CI
是列索引。下面的语句表示未使用“with=F”
。当我删除这些部分时,它也无法按预期工作。有什么建议吗?
换句话来说:我想设置与 FROM control 的 control 相对应的 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]
顺便说一句,请有人解释一下如何在不使用索引的情况下轻松分配列集!索引和 data.table 是天作之合。
最佳答案
您可以同时使用 :=
运算符和连接,如下所示:
首先准备数据:
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 是数字类型,x
的列是整数类型,因此当您在您的数据上运行,类型不匹配,因此必须进行强制转换。
关于r - 通过连接分配 data.table 行和列的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976527/