使用合并在 R 中定义 data.table 的子集

Using a merge to define a subset of a data.table in R

我正在使用多个合并在 R 中定义一个 ID 变量(有关更多上下文,请参阅 this 问题)。

我想合并变量 vdata.table xdata.table y 首先根据键 k1 y.

然后对于那些在第一阶段没有匹配到的观察结果,我想按照table yk2.

进行合并
y[is.na(v),x,v:=v]

不起作用,因为 data.table 语法在合并时需要先 data.table

y[is.na(v),][x,v:=v]

在某种意义上有效,但不会将合并结果保存到 y

这是一个最小的例子:

x<-data.table(v1=c("A","B","C"),v2=c("a","b","c"),v=rnorm(3),key=c("v1","v2"))
y<-data.table(v1=c("A","B","C"),v21=c("","b","c"),v22=c("a","",""))
setkey(y,v1,v21)
y[x,v:=v]

给予

> x
   v1 v2          v
1:  A  a  0.3316665
2:  B  b  0.8470424
3:  C  c -0.5955292
> y
   v1 v21 v22          v
1:  A       a         NA
2:  B   b      0.8470424
3:  C   c     -0.5955292

当然我想要的是:

> y
   v1 v21 v22          v
1:  A       a  0.3316665
2:  B   b      0.8470424
3:  C   c     -0.5955292

试试这个:

setkey(y, v1, v22)
y[x, v := ifelse(is.na(v), i.v, v)]

i.可以用来区分相同的列名和i-expressiondata.table.

我正在使用的 @eddi 解决方案的替代方案更加稳健:

setkey(y, v1, v22)
y[x[!(v %in% y$v),],v:=i.v]

(基本上,不是子集 y,而是通过 y 子集 x 并将子集 x 加入 y