【问题标题】:dplyr full_join does not work as expecteddplyr full_join 无法按预期工作
【发布时间】:2015-05-22 12:04:48
【问题描述】:

这是一个玩具示例(merge 来自基本包,完整来自 dplyr):

require(dplyr)
a = data.frame(Day=Sys.Date()+1:5,x=1:5)
b = data.frame(Day=Sys.Date()-1:5,x=3*(1:5))

x1 = b
x2 = b
for(i in 1:10){
   x1=full_join(x1,a,by="Day")
   x2 = merge(x2,a,by="Day",all=T)
}

x1 和 x2 不同。我希望 x2 因为“a”附加到末尾。 这是 x2(前 5 行):

2015-05-14 15 NA NA NA NA NA NA NA NA NA NA

2015-05-15 12 NA NA NA NA NA NA NA NA NA NA

2015-05-16 9 NA NA NA NA NA NA NA NA NA NA

2015-05-17 6 NA NA NA NA NA NA NA NA NA NA

但是来自 full_join 的 x1 是:

Day x.x x.y x.x x.y x.x x.y x.x x.y x.x x.y x

1 2015-05-18 3 NA 3 NA 3 NA 3 NA 3 NA NA

2 2015-05-17 6 NA 6 NA 6 NA 6 NA 6 NA NA

3 2015-05-16 9 NA 9 NA 9 NA 9 NA 9 NA NA

这是一个错误吗?或者这是预期的?我希望合并(x2)的输出在逻辑上是正确的......我想要使用 dplyr full_join 的 x2。有什么办法吗?

【问题讨论】:

  • 您的 for 循环没有要循环的 i。你想循环浏览哪 10 个项目?
  • i 不相关。我只是想创建一个简单的例子,按顺序合并几个data.frames。在这种情况下,我将相同的 data.frame "a" 合并到 x1(或 x2)的右侧。

标签: r dplyr


【解决方案1】:

如果重命名数据框中的列a,这两种方法的行为是相同的:

require(dplyr)
a = data.frame(Day=Sys.Date()+1:5,y=1:5)
b = data.frame(Day=Sys.Date()-1:5,x=3*(1:5))

x1 = b
x2 = b
for(i in 1:10){
  x1=full_join(x1,a,by="Day")
  x2=merge(x2,a,by="Day",all=T)
}

# fix up the column names...
names(x1) <- sapply(1:ncol(x1), function(x) {paste0("V", x)})
names(x2) <- sapply(1:ncol(x2), function(x) {paste0("V", x)})

x1 %>% arrange(desc(V1))
x2 %>% arrange(desc(V1))

所以在这里我改变了这一行:

a = data.frame(Day=Sys.Date()+1:5,x=1:5)

a = data.frame(Day=Sys.Date()+1:5,y=1:5)

为什么会这样?当您运行上面提供的代码时,您实际上应该收到一条警告消息。在我的 R 版本中,我得到以下信息:

Warning messages:
1: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’ are duplicated in the result
2: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’ are duplicated in the result
3: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’ are duplicated in the result
4: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’ are duplicated in the result
5: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’ are duplicated in the result
6: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’ are duplicated in the result
7: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’ are duplicated in the result
8: In merge.data.frame(x2, a, by = "Day", all = T) :
  column names ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’, ‘x.x’, ‘x.y’ are duplicated in the result

所以我认为,full_joinmerge 的结果在这种情况下不匹配的原因是因为您提供的两个数据框中的列不明确。当您消除这种歧义时,结果会按预期匹配,所以我不认为这是一个错误。

【讨论】:

  • 谢谢。这样就解决了问题。我同意,看起来问题出在 col 名称上。然而,它依赖于 col 名称有点奇怪。确实,合并给了我们警告,但“正确”的想法仍然......
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 2014-12-09
  • 2016-01-13
  • 2020-09-21
  • 2011-08-17
  • 2012-04-29
  • 2021-08-12
  • 2019-02-04
相关资源
最近更新 更多