R 通过联接指定data.table行和列的子集

R 通过联接指定data.table行和列的子集,r,data.table,R,Data.table,我正在尝试做一些类似的事情,但与这里描述的内容不同: 具体来说,我想从表控件中为匹配的键值(person\u id是两个表中的键)列值赋值CI是列索引。下面的语句表示未使用“with=F”。当我删除这些部分时,它也不能像预期的那样工作。有什么建议吗 换言之:我想设置与control FROM control相对应的flatData子集 flatData[J(eval(control$person_id)), ci, with=F] = control[, ci, with=F] 使用经典R给

我正在尝试做一些类似的事情,但与这里描述的内容不同:

具体来说,我想从表控件中为匹配的键值(
person\u id
是两个表中的键)列值赋值
CI
是列索引。下面的语句表示未使用“with=F”。当我删除这些部分时,它也不能像预期的那样工作。有什么建议吗

换言之:我想设置与control FROM 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]

另外,请有人解释一下如何在不使用索引的情况下轻松分配列集合!index和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
是列名
数据。当执行
x[i]
形式的联接时,当
x
i
具有相同的列名时,表
内部生成以便于访问
i
的列


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

亲爱的@Arun,虽然我总体上喜欢您的答案,它确实存在显式枚举列集的问题,我说过我不愿意这样做-我的列集非常大。我使用colidx有一个原因:(也许有一种方法可以使用列表来实现这个目的?检查
eval(parse(…)
类型表达式的构造和使用,或者检查另一种方法-用符号构造表达式。