Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并R中的数据帧:结果未排序。_R_Sorting_Dataframe_Merge - Fatal编程技术网

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

合并R中的数据帧:结果未排序。,r,sorting,dataframe,merge,R,Sorting,Dataframe,Merge,这是基于上的一个示例。 我想将多个数据帧合并到一个公共列中——可以通过链接上提供的示例来实现这一点。 但使用参数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) 给我 i j k l 1

这是基于上的一个示例。 我想将多个数据帧合并到一个公共列中——可以通过链接上提供的示例来实现这一点。 但使用参数
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)
给我

  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),
       list(x,y,z))
Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "i", all = TRUE,sort = TRUE),
       list(x,y,z))
给我和上面一样的结果。我知道我可以在合并后对数据帧进行排序(我想可能更有效),但是为什么
sort=TRUE
没有效果呢

我在Mac上运行RStudio下的R3.4.3。 谢谢
Rafael

两个函数调用显示相同行为的原因是sort=T是merge函数的默认操作

排序顺序不符合要求的原因是在Reduce函数中嵌入了merge函数

排序对于每个单独的联接都是正确的,但对于由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...)
默认的
merge()
函数调用假定
sort=TRUE
,因此您的第一个代码是等价的:
merge(dtf1,dtf2,by=“i”,all=TRUE,sort=TRUE)

R文档说明
sort=TRUE
时,结果按
列进行排序,因此在您的情况下,它是在第一个数据帧中的
m
b
c
之间进行排序(按该顺序产生b、c、m),然后排序
n
c
d
(按该顺序生成c、d、n),然后对
o
d
a
(按该顺序生成a、d、o)

当您连接(
c()
)或通过
rbind()
将它们组合在一起时,您会得到一个列表,结果是“b,c,m,c,d,n,a,o”。

d'oh

i
是一个因素,而不是一个字符

阅读本文:帮助我将键列转换为可排序的值,并解决了这个问题


感谢您的评论和回答。

merge()
sort=
的默认值为
TRUE
。请尝试
sort=FALSE