Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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中的数据帧_R_Data.table - Fatal编程技术网

合并数据表,如R中的数据帧

合并数据表,如R中的数据帧,r,data.table,R,Data.table,由于时间限制,我决定在代码中使用数据表而不是数据帧,因为它们速度更快。但是,我仍然需要数据帧的功能。我需要合并两个数据表,保存所有值(如在merge中设置all=TRUE) 一些示例代码: > x1 = data.frame(index = 1:10) > y1 = data.frame(index = c(2,4,6), weight = c(.2, .5, .3)) > x1 index 1 1 2 2 3 3 4 4 5

由于时间限制,我决定在代码中使用数据表而不是数据帧,因为它们速度更快。但是,我仍然需要数据帧的功能。我需要合并两个数据表,保存所有值(如在merge中设置all=TRUE)

一些示例代码:

> x1 = data.frame(index = 1:10)
> y1 = data.frame(index = c(2,4,6), weight = c(.2, .5, .3))
> x1
   index
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
10    10
> y1
  index weight
1     2    0.2
2     4    0.5
3     6    0.3

> merge(x,y, all=TRUE)
      index weight
 [1,]     1     NA
 [2,]     2      1
 [3,]     3     NA
 [4,]     4      2
 [5,]     5     NA
 [6,]     6      3
 [7,]     7     NA
 [8,]     8     NA
 [9,]     9     NA
[10,]    10     NA
现在我可以对数据表做类似的事情了吗?(NA不一定要保留,我将它们更改为0)

我知道你可以合并,但我也知道有一种更快的方法。

所以从

我使用如下函数:

mergefast<-function(x,y,by.x,by.y,all) {
  x_dt<-data.table(x)
  y2<-y
  for (i in 1:length(by.y)) names(y2)[grep(by.y[i],names(y2))]<-by.x[i]
  y_dt<-data.table(y2)
  setkeyv(x_dt,by.x)
  setkeyv(y_dt,by.x)
  as.data.frame(merge(x_dt,y_dt,by=by.x,all=all))
}

它有点缺少
merge
所具有的功能,例如
by
all.x
all.y
,但这些功能很容易合并

我过去一直在思考这个问题,但从未找到答案。我不认为这是解决了,或者我太密集,看不到它的覆盖。当我需要这样做时,我总是求助于使用
merge()
,而且,
merge.data.table
在最近的版本中已经加快了速度。因此,现在使用
merge()
vs
X[Y]
的惩罚要小得多。键入
data.table:::merge.data.table
以查看它如何在内部使用
X[Y]
工作。@MatthewDowle-啊,是的,我已经读了几遍,但它没有真正点击。看到这个例子和下面的答案,一切都是圆的。干杯,是的,我一秒钟前就知道了。实际上,y2[x2]也可以正常工作,但我之前忽略了它,因为x2[y2]并没有保存所有的元素,我认为它们是一样的。谢谢你将如何在两边进行外部连接;i、 e.如果:y2=data.table(index=c(2,4,6,7,8,11),weight=c(.3,5,2),key=“index”)?我希望将所有11个索引值作为merge(…,all=TRUE)的输出。我认为您可以尝试使用all=TRUE的纯旧merge(),因为它使用了更快的merge.data.table()函数。然而,我还没有让它正常工作,所以我会回到这个话题。
x2 = data.table(index = 1:10, key ="index")
y2 = data.table(index = c(2,4,6), weight= c(.3,.5,.2),key="index")
y2[J(x2$index)]
mergefast<-function(x,y,by.x,by.y,all) {
  x_dt<-data.table(x)
  y2<-y
  for (i in 1:length(by.y)) names(y2)[grep(by.y[i],names(y2))]<-by.x[i]
  y_dt<-data.table(y2)
  setkeyv(x_dt,by.x)
  setkeyv(y_dt,by.x)
  as.data.frame(merge(x_dt,y_dt,by=by.x,all=all))
}
mergefast(x1,y1,by.x="index",by.y="index",all=T)