Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用合并在R中定义data.table的子集_R_Data.table - Fatal编程技术网

使用合并在R中定义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

我正在使用多个合并来定义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=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]