合并数据表,如R中的数据帧
由于时间限制,我决定在代码中使用数据表而不是数据帧,因为它们速度更快。但是,我仍然需要数据帧的功能。我需要合并两个数据表,保存所有值(如在merge中设置all=TRUE) 一些示例代码:合并数据表,如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
> 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()
vsX[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)