12

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

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

4

2 回答 2

8

因此,从将外键上的 SQL 连接翻译为 R 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)]
于 2012-07-11T15:37:27.083 回答
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具有例如by,的功能all.xall.y但这些可以很容易地合并。

于 2013-12-18T16:20:18.113 回答