通过join分配data.table行和列的子集

时间:2014-04-10 00:37:00

标签: r data.table

我正在尝试做类似但与此处描述的不同的事情: 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是在地狱里结婚。

1 个答案:

答案 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.ai.b是内部生成的列名data.table,可在ix时轻松访问i列在执行表单x[i]的连接时具有相同的列名。

HTH

PS:在您的示例y的列中,a和b的类型为numeric,x的类型为整数,因此在运行数据时会收到警告,类型相匹配,因此必须进行强制。