我使用多个合并来定义R中的ID变量(有关更多上下文,请参阅this问题)。
我希望首先将v
data.table
中的变量x
合并到data.table
y
,例如k1
中的y
1}}。
然后,对于那些在第一阶段没有匹配的观察,我想根据表y
键k2
合并它们。
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
答案 0 :(得分:3)
试试这个:
setkey(y, v1, v22)
y[x, v := ifelse(is.na(v), i.v, v)]
i.
可用于区分i-expression
data.table
的相同列名。
答案 1 :(得分:1)
我正在使用的@ eddi解决方案的替代方案更加强大:
setkey(y, v1, v22)
y[x[!(v %in% y$v),],v:=i.v]
(基本上,不是通过y
对子集x
进行子集化,而是将子集y
加入x
。