r - 通过连接分配 data.table 行和列的子集

标签 r data.table

我正在尝试做一些与此处描述的类似但又足够不同的事情: 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.ai.bdata.table 内部生成的列名称,以便轻松访问 i当执行 x[i] 形式的联接时,xi 具有相同列名称的列。

HTH

PS:在您的示例中,y 的列 a 和 b 是数字类型,x 的列是整数类型,因此当您在您的数据上运行,类型不匹配,因此必须进行强制转换。

关于r - 通过连接分配 data.table 行和列的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976527/

相关文章:

r - 使用与列同名的对象过滤 data.table 中的行

r - 读取多个文件时的内存管理

r - 在 R 中绘制密度

r - data.table 二级键的问题

r - ggplot中轴的默认文本颜色

r - 分离(或类似的功能)具有多个或没有出现分割字符

r - 过滤组,其中一个变量的最大值,另一个变量等于特定值

r - 计算多列上的多个 Pareto 图

r - 如何在 R 中构建一次汇总多个值的表

r - 在 names<-() 中创建对象会出错。如何解释?