【问题标题】:How to merge data frames?如何合并数据框?
【发布时间】:2018-07-20 15:03:00
【问题描述】:

我有 3 个数据框,如下所示:

数据框 1

ColA    ColB    ColC
1       B1      1-C1
2       B2      1-C2
3       B3      1-C3
4       B4  
5       B5  
6       B6  
7       B7  
8       B8  
9       B9      1-C9
10      B10 
11      B11 
12      B12     1-C12
13      B13 
14      B14     1-C14

数据框 2

ColA    ColB    ColC
1       B1  
2       B2  
3       B3      2-C3
4       B4      2-C4
5       B5  
6       B6      2-C6
7       B7  
8       B8      2-C8
9       B9      2-C9
10      B10 
11      B11 
12      B12     2-C12
13      B13 
14      B14     2-C14
15      B15     2-C15

数据框 3

ColA    ColB    3-Col3-C
1       B1  
2       B2  
3       B3       3-C3
4       B4  
5       B5  
6       B6       3-C6
7       B7  
8       B8  
9       B9       3-C9
10      B10 
11      B11      3-C11
12      B12      3-C12
13      B13      3-C13
14      B14 
15      B15      3-C15
16      B16      3-C16
17      B17      3-C17

我想合并这些数据框。第一个数据帧中的数据优先。第二个数据帧的数据占第二优先级,第三组的数据占最后优先级。我该怎么做?我想要的输出如下所示。

所需的数据框:

ColA    ColB    ColC
1       B1      1-C1
2       B2      1-C2
3       B3      1-C3
4       B4      2-C4
5       B5  
6       B6      2-C6
7       B7  
8       B8      2-C8
9       B9      1-C9
10      B10 
11      B11     3-C11
12      B12     1-C12
13      B13     3-C13
14      B14     1-C14
15      B15     3-C15
16      B16     3-C16
17      B17     3-C17

【问题讨论】:

  • 列中的空白值是什么?它们是 NA 值吗?它们是零长度字符串吗?空间?如果您在reproducible format 中毫无歧义地共享您的数据,则更容易提供帮助。
  • @MrFlick 它们基本上是 NA 值。
  • 如果来自 first 的数据优先,然后是 2nd 和最后 3rd,则预期输出中的某些值未显示。例如,“B13”对于第一个和第二个数据集有 NA,而对于第三个数据集它不是空的。不应该是第三个数据的值吗?
  • 对不起,这是我的一个错误,我会改变它。谢谢。
  • @J.Doe 如果是这种情况,请检查发布的解决方案。它应该工作

标签: r


【解决方案1】:

我们可以将数据集保存在list 中,然后通过'ColA'、'ColB' 和coalesce 'ColC' 列执行full_join 以返回输出

library(tidyverse)
list(df1, df2, df3) %>% 
    reduce(full_join, by = c('ColA', 'ColB')) %>% 
    transmute(ColA, ColB, ColC = coalesce(ColC.x, ColC.y, ColC))

注意:根据OP的cmets,数据中的空白是NA元素

【讨论】:

  • 如果您想使用 8 个数据帧而不是 3 个数据帧,您将如何更改?我猜您必须将数据框添加到列表中,但您是否需要更改其他任何内容?
  • @J.Doe 如果对象名称是 'df1', 'df2', ... , 'df3', 那么你可以在mget(ls(pattern="^df\\d+")) %>% reduce(的列表中得到它
  • 嘿,只是另一个后续问题。如果您希望它在数据框 1 中保留相同数量的行,您知道如何处理原始问题吗?所以输出基本相同,但不包括第 15、16 和 17 行。
  • @J.Doe 在reduce 步骤中,您可能需要left_joinreduce(left_join,
猜你喜欢
  • 2022-08-18
  • 2018-12-07
  • 2019-08-02
  • 2020-01-27
  • 1970-01-01
  • 2023-01-25
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多