R语言合并数据框结果未排序,sort参数无效问题求助
嘿,我来帮你搞定这个合并多个data.frame时sort参数失效的问题!
先明确你的需求:合并共享i列的多个data.frame,并且希望最终结果按i列排序对吧?咱们先从你的可复现代码说起:
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)
为什么你的sort=TRUE没生效?
大概率是你在使用Reduce时,参数传递的方式不对!比如如果你用了匿名函数包裹merge,但没把sort参数传递到内部的merge调用中,或者没同时指定all=TRUE(毕竟你要合并所有行,而不是只保留共同的i值)。
举个错误的例子:
# 错误写法:sort=TRUE被传给Reduce,但匿名函数没把它传给merge Reduce(function(d1,d2) merge(d1,d2, all=TRUE), list(x,y,z), sort=TRUE)
这里的sort=TRUE根本没被用到,因为匿名函数只接受d1和d2两个参数,不会把额外参数传递给内部的merge。
正确的解决方法
有两种靠谱的方式可以实现你的需求:
方法1:直接给Reduce传递merge的所有参数
Reduce的...参数会直接传递给每次调用的merge函数,所以你可以直接把all=TRUE(保留所有行)和sort=TRUE(按i列排序)都传进去:
merged_sorted <- Reduce(merge, list(x, y, z), all=TRUE, sort=TRUE)
运行后得到的结果就是按i列字母顺序排序的全连接合并结果:
i j k l 1 a NA NA 9 2 b 2 NA NA 3 c 3 5 NA 4 d NA 6 8 5 m 1 NA NA 6 n NA 4 NA 7 o NA NA 7
方法2:在匿名函数里明确指定参数
如果你需要更灵活的控制(比如自定义合并的列),可以在匿名函数里明确把sort=TRUE和all=TRUE传给merge:
merged_sorted <- Reduce(function(d1, d2) { merge(d1, d2, by = "i", all = TRUE, sort = TRUE) }, list(x, y, z))
这种写法更清晰,能明确看到每次合并的参数设置,结果和方法1完全一致。
额外提示:merge的sort参数作用
merge的sort=TRUE参数是对**合并的键列(这里是i)**进行排序,它只会影响最终结果中键列的顺序,不会对其他列做排序。如果你需要对其他列排序,可以在合并后用order()或者dplyr::arrange()来处理。
内容的提问来源于stack exchange,提问作者Rafael Santos
相关产品推荐
相关产品推荐

