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

时间:2015-03-23 20:30:49

标签: r data.table

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

我希望首先将v data.table中的变量x合并到data.table y,例如k1中的y 1}}。

然后,对于那些在第一阶段没有匹配的观察,我想根据表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

2 个答案:

答案 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