【问题标题】:Merging data frames in R: results not sorted.在 R 中合并数据框:结果未排序。
【发布时间】:2023-04-10 01:38:01
【问题描述】:

这是基于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。 谢谢 拉斐尔

【问题讨论】:

  • sort= 的默认值为TRUE in merge()。试试sort=FALSE

标签: r sorting dataframe merge


【解决方案1】:

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

R 文档说sort=TRUE 时,结果在by 列上排序,所以在你的情况下,它在mbc 之间排序在第一个数据帧中(按该顺序产生 b、c、m),然后对 ncd 进行排序(按该顺序产生 c、d、n),然后对 @ 987654332@、da(按顺序产生 a、d、o)。

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

【讨论】:

    【解决方案2】:

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

    排序顺序不符合您要求的原因是由于在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...)
    

    【讨论】:

      【解决方案3】:

      天啊!

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

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

      感谢cmets和答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-05
        • 2012-04-06
        • 1970-01-01
        • 2022-01-22
        • 2017-04-03
        • 2019-03-25
        相关资源
        最近更新 更多