【问题标题】:Merge data tables like data frames in R合并数据表,如 R 中的数据框
【发布时间】:2012-07-11 15:00:43
【问题描述】:

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

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

【问题讨论】:

  • 我过去曾思考过这个问题,但从未找到答案。我认为FAQ 也没有解决这个问题,或者我太密集了,看不到它在哪里被覆盖。当我需要这样做时,我总是使用merge()...
  • 另外,merge.data.table 在最近的版本中得到了加速。所以现在使用merge()X[Y] 的惩罚(嗯,应该)要少得多。输入 data.table:::merge.data.table 以查看在内部使用 X[Y] 的工作原理。
  • @MatthewDowle - 啊,是的,我已经阅读了几次,但它并没有真正点击。看到这个例子和下面的答案,一切都变得圆满了。干杯。

标签: r data.table


【解决方案1】:

所以继续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)]

【讨论】:

  • 是的,实际上是在一秒钟前发现的。实际上 y2[x2] 也可以正常工作,但我之前忽略了它,因为 x2[y2] 没有保留所有这些,我认为它们是相同的。谢谢!
  • 你将如何在两边进行外部连接;即如果: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() 函数。但是,我还没有让它正常工作,所以我会回到这个。
【解决方案2】:

我使用如下函数:

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,但这些可以很容易地合并。

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 2012-04-06
    • 2022-07-04
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多