【问题标题】:Merging multiple datasets and sort by id [duplicate]合并多个数据集并按 id 排序 [重复]
【发布时间】:2019-10-31 10:00:24
【问题描述】:

我正在尝试合并多个数据框。假设我有以下数据框:

library(tidyverse)
id <- c(10, 10, 12, 12, 13)
data <- c(500, 600, 700, 800, 900)
data1 <- data.frame(id, data)

id <- c(10, 12, 13, 14)
data <- c(550, 850, 950, 1050)
data2 <- data.frame(id, data)

id <- c(15)
data <- c(1350)
data3 <- data.frame(id, data)

现在我想加入数据框,使输出看起来像这样:

> srtdata
   id data
1  10  500
2  10  600
6  10  550
3  12  700
4  12  800
7  12  850
5  13  900
8  13  950
9  14 1050
10 15 1350

这就是我这样做的方式。

mdata1 <- dplyr::full_join(data1, data2)
mdata2 <- dplyr::full_join(mdata1, data3)

我必须写两行,因为似乎full_join 可以同时占用两帧xy

为了以正确的方式对数据进行排序,我使用了来自 base R 的 order:

srtdata <- mdata2[order(mdata2$id), ]

有人来帮我找到更好的解决方案吗?

【问题讨论】:

  • 明显重复
  • Reduce(function(x, y){merge(x, y, all = TRUE, by = intersect(colnames(x), colnames(y)))}, list(data1, data2,数据3))

标签: r dataframe dplyr data.table


【解决方案1】:

当您的数据框有一些重叠时,请使用连接。如果您只是想堆叠数据帧,请使用dplyr::bind_rows。然后使用dplyr::arrange排序:

bind_rows(data1, data2, data3) %>% 
    arrange(id)

#### OUTPUT ####

   id data
1  10  500
2  10  600
3  10  550
4  12  700
5  12  800
6  12  850
7  13  900
8  13  950
9  14 1050
10 15 1350

bind_rows 也适用于数据框列表:

df_list <- list(data1 = data1, data2 = data2, data3 = data3)
bind_rows(df_list, .id = "dataframe") %>% 
    arrange(id)

#### OUTPUT ####

   dataframe id data
1      data1 10  500
2      data1 10  600
3      data2 10  550
4      data1 12  700
5      data1 12  800
6      data2 12  850
7      data1 13  900
8      data2 13  950
9      data2 14 1050
10     data3 15 1350

【讨论】:

    【解决方案2】:

    您也可以使用data.table 包中的rbindlist

    require(data.table)
    rbindlist(list(data1, data2, data3))[order(id)]
    
        id data
     1: 10  500
     2: 10  600
     3: 10  550
     4: 12  700
     5: 12  800
     6: 12  850
     7: 13  900
     8: 13  950
     9: 14 1050
    10: 15 1350
    

    【讨论】:

      【解决方案3】:

      看起来你正在寻找bind_rows

      bind_rows(data1, data2, data3) %>%
        arrange(id)
      

      如果您的 data.frames 都在列表中,您也可以在列表中使用 bind_rows(感谢 Shinobi_Atobe 指出此处已过时使用 do.call):

      mylist <- list(data1, data2, data3)
      bind_rows(mylist) %>%
        arrange(id)
      

      如果您有大量 data.frames 并且您不想拼写每个 data.frame 的名称,则最后一种方法很有用。

      【讨论】:

      • 恐怕我在第一个答案上领先你几分钟。值得一提的是do.call。也许会扩展
      • 您需要do.call 吗? bind_rows(mylist) 不工作吗?
      • @Shinobi_Atobe 谢谢。不知道。我以前经常使用do.call(rbind, ...),但这种快捷方式是不可能的。
      猜你喜欢
      • 2021-02-03
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多