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

时间:2012-07-11 15:00:44

标签: r data.table

由于时间限制,我决定在我的代码中使用数据表而不是数据帧,因为它们要快得多。但是,我仍然想要数据帧的功能。我需要合并两个数据表,保留所有值(比如在合并中设置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)。

> x2 = data.table(index = 1:10, key ="index")
> y2 = data.table(index = c(2,4,6), weight= c(.3,.5,.2))

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

2 个答案:

答案 0 :(得分:8)

所以继续Translating SQL joins on foreign keys to R data.table syntax

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)]

答案 1 :(得分:1)

我使用的函数如下:

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)

merge具有的功能有点缺失,例如byall.xall.y,但这些可以很容易地合并。