使用合并在 R 中定义 data.table 的子集
Using a merge to define a subset of a data.table in R
我正在使用多个合并在 R 中定义一个 ID 变量(有关更多上下文,请参阅 this 问题)。
我想合并变量 v
从 data.table
x
到 data.table
y
首先根据键 k1
y
.
然后对于那些在第一阶段没有匹配到的观察结果,我想按照table 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
试试这个:
setkey(y, v1, v22)
y[x, v := ifelse(is.na(v), i.v, v)]
i.
可以用来区分相同的列名和i-expression
data.table
.
我正在使用的 @eddi 解决方案的替代方案更加稳健:
setkey(y, v1, v22)
y[x[!(v %in% y$v),],v:=i.v]
(基本上,不是子集 y
,而是通过 y
子集 x
并将子集 x
加入 y
。
我正在使用多个合并在 R 中定义一个 ID 变量(有关更多上下文,请参阅 this 问题)。
我想合并变量 v
从 data.table
x
到 data.table
y
首先根据键 k1
y
.
然后对于那些在第一阶段没有匹配到的观察结果,我想按照table 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
试试这个:
setkey(y, v1, v22)
y[x, v := ifelse(is.na(v), i.v, v)]
i.
可以用来区分相同的列名和i-expression
data.table
.
我正在使用的 @eddi 解决方案的替代方案更加稳健:
setkey(y, v1, v22)
y[x[!(v %in% y$v),],v:=i.v]
(基本上,不是子集 y
,而是通过 y
子集 x
并将子集 x
加入 y
。