合并R中的数据框:结果未排序。

时间:2018-04-23 12:20:57

标签: r sorting dataframe merge

这是基于Simultaneously merge multiple data.frames in a list的示例。 我想将多个数据框与一个共同的列合并 - 可以使用链接上提供的示例来实现。 但似乎使用参数sort=TRUE无效。以下是简短,可重现的代码:

x <- data.frame(i = c("m","b","c"), j = 1:3)
y <- data.frame(i = c("n","c","d"), k = 4:6)
z <- data.frame(i = c("o","d","a"), l = 7:9)

合并所有不用排序:

Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "i", all = TRUE),
       list(x,y,z))

给我

  i  j  k  l
1 b  2 NA NA
2 c  3  5 NA
3 m  1 NA NA
4 d NA  6  8
5 n NA  4 NA
6 a NA NA  9
7 o NA NA  7

合并所有排序:

Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "i", all = TRUE,sort = TRUE),
       list(x,y,z))

给我与上面相同的结果。我知道我可以在合并后对数据帧进行排序(我猜它甚至可能更有效),但为什么sort = TRUE没有效果呢?

我在Mac上用RStudio运行R 3.4.3。 谢谢 圣拉斐尔

3 个答案:

答案 0 :(得分:1)

默认的merge()函数调用假定为sort=TRUE,因此您的第一个代码是等效的:merge(dtf1, dtf2, by = "i", all = TRUE, sort=TRUE)

R文档说明sort=TRUE,结果按by进行排序,因此在您的情况下,它会在m之间进行排序,{第一个数据框中的{1}}和b(按此顺序生成b,c,m),然后排序cnc(结果在c,d,n中按顺序),然​​后它对dod进行排序(按此顺序生成a,d,o)。

当您连接(a)或通过c()将它们组合在一起时,您会得到一个列表,其中包含&#34; b,c,m,c,d,n,a,o& #34 ;.

答案 1 :(得分:0)

2函数调用显示相同行为的原因是因为sort = T是合并函数的默认操作。

排序顺序不是您需要的原因是由于在Reduce函数中嵌入了合并函数。

对于每个单独的连接,排序是正确的,但不是由Reduce步骤创建的整体结果表。

你试过dplyr吗?为什么要使用reduce和merge?

你可以用这个来实现同样的目标:

if(!irequire(dplyr)){install.packages('dplyr')}; require(dplyr)
x %>%
left_join(y, by = 'i') %>%
left_join(z, by = 'i') %>%
arrange(...whatever order you wish said the Djinn...)

答案 2 :(得分:0)

D'哦!

i是一个因素而非角色。

阅读本文:How to convert a factor to integer\numeric without loss of information?帮助我将键列转换为可排序的值并解决了问题。

感谢您的评论和解答。