使用合并在R中定义data.table的子集
我正在使用多个合并来定义R中的ID变量,请参见问题以了解更多上下文 我想首先根据y中的键k1将变量v从data.table x合并到data.table y 然后对于那些在第一阶段没有匹配的观察结果,我想根据表y键k2合并它们 不起作用,因为data.table语法要求在合并时首先使用data.table使用合并在R中定义data.table的子集,r,data.table,R,Data.table,我正在使用多个合并来定义R中的ID变量,请参见问题以了解更多上下文 我想首先根据y中的键k1将变量v从data.table x合并到data.table y 然后对于那些在第一阶段没有匹配的观察结果,我想根据表y键k2合并它们 不起作用,因为data.table语法要求在合并时首先使用data.table y[is.na(v),][x,v:=v] 从某种意义上说是可行的,但不会将合并结果保存到y 下面是一个简单的例子: x<-data.table(v1=c("A","B","C"),v2
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]
当然,我想要的是:
> 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表达式数据表中区分相同的列名。请尝试以下操作:
setkey(y, v1, v22)
y[x, v := ifelse(is.na(v), i.v, v)]
一,。可用于从i-expression data.table中区分相同的列名。我正在使用的@eddi解决方案的另一种更为健壮的替代方案:
setkey(y, v1, v22)
y[x[!(v %in% y$v),],v:=i.v]
基本上,不是子集y,而是子集x通过y,并将子集x连接到y。我正在使用的@eddi解决方案的另一个替代方案更稳健:
setkey(y, v1, v22)
y[x[!(v %in% y$v),],v:=i.v]
基本上,不是子集y,而是子集x通过y,并将子集x连接到y。hmm我应该更新我的示例。我不想做的是覆盖任何原始匹配项。@MichaelChirico我明白了,试试上面的版本,这样就行了。有没有节省时间的建议?这对我来说不是问题,但最好避免在第一次合并命中率达到90%时重复工作observations@MichaelChirico也许您可以先将y中的列组合起来?我喜欢y[,newcol:=v21][newcol==,newcol:=v22],然后将其合并,而不是对我来说没有骰子。在我的例子中,我试图首先在名字/姓氏上匹配人;第二轮的名字/娘家姓匹配。所以我不想删除姓氏。嗯,我应该更新我的例子。我不想做的是覆盖任何原始匹配项。@MichaelChirico我明白了,试试上面的版本,这样就行了。有没有节省时间的建议?这对我来说不是问题,但最好避免在第一次合并命中率达到90%时重复工作observations@MichaelChirico也许您可以先将y中的列组合起来?我喜欢y[,newcol:=v21][newcol==,newcol:=v22],然后将其合并,而不是对我来说没有骰子。在我的例子中,我试图首先在名字/姓氏上匹配人;第二轮的名字/娘家姓匹配。所以我不想抹去姓氏。同样,setkeyy,v1,v22,setkeyx,v,y[x[Jsetdiffx$v,y$v],v:=i.v]同样,setkeyy,v1,v22,setkeyx,v,y[x[Jsetdiffx$v,y$v],v:=i.v]