这是基于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。 谢谢 圣拉斐尔
答案 0 :(得分:1)
默认的merge()
函数调用假定为sort=TRUE
,因此您的第一个代码是等效的:merge(dtf1, dtf2, by = "i", all = TRUE, sort=TRUE)
。
R文档说明时sort=TRUE
,结果按by
列进行排序,因此在您的情况下,它会在m
之间进行排序,{第一个数据框中的{1}}和b
(按此顺序生成b,c,m),然后排序c
,n
,c
(结果在c,d,n中按顺序),然后它对d
,o
,d
进行排序(按此顺序生成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?帮助我将键列转换为可排序的值并解决了问题。
感谢您的评论和解答。