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(…)
类型表达式的构造和使用,或者检查另一种方法-用符号构造表达式。