【问题标题】:How to merge two dataframes that have different column names如何合并具有不同列名的两个数据框
【发布时间】:2021-01-16 11:51:30
【问题描述】:

好的,我有两个数据框,出于我的问题的目的,我将使用虚拟数据

df1:
Decimal.hour  Temp  Depth   Salinity 
4.1           10     -3        34
4.2           10     -3.2      33
4.5           9      -3.1      33
4.6           9      -3.2      34
4.7           10     -3.3      34
6.2           15     -3.1      32 
6.4           15     -3.2      32
6.6           14     -3        33
6.7           14     -3        32
7.0           11     -3.1      33
7.1           12     -3.1      33     
7.2           12     -3.1      33
7.4           11     -3.3      34

df2:
Decimal.hour  Run   Transect  Site   Phase   Count   Age 
4.1            1       2        1      1       12     1
4.2            1       2        1      1        3     1
4.5            2       1        2      1        4     1     
4.6            2       1        2      1        10    1
4.7            1       2        1      1        5     6
6.6            3       1        1      1        7     2             
6.7            3       1        1      1        2     1
6.8            3       2        2      1        10    1
6.9            3       2        2      1        9     1
7.0            4       1        2      1        2     1
7.1            4       1        2      1        2     1
7.2            4       2        1      1        6     1
7.3            4       2        1      1        5     2

然后我将如何组合这两个数据框来给我以下数据框? (这是我的理想输出)

df3:
Decimal.hour  Temp  Depth   Salinity  Run   Transect  Site   Phase   Count   Age 
4.1           10     -3        34      1       2        1      1       12     1
4.2           10     -3.2      33      1       2        1      1        3     1
4.5           9      -3.1      33      2       1        2      1        4     1 
4.6           9      -3.2      34      2       1        2      1        10    1
4.7           10     -3.3      34      1       2        1      1        5     6
6.2           15     -3.1      32      NA      NA       NA     NA       NA    NA
6.4           15     -3.2      32      NA      NA       NA     NA       NA    NA
6.6           14     -3        33      3       1        1      1        7     2 
6.7           14     -3        32      3       1        1      1        2     1
6.8           NA      NA       NA      3       2        2      1        10    1
6.9           NA      NA       NA      3       2        2      1        9     1
7.0           11     -3.1      33      4       1        2      1        2     1
7.1           12     -3.1      33      4       1        2      1        2     1
7.2           12     -3.1      33      4       2        1      1        6     1
7.3           NA.     NA.      NA      4       2        1      1        5     2
7.4           11     -3.3      34      4       2        1      1        5     2

如您所见,这两个数据框都有相同的列 (Decimal.hour),所以我正在寻找一种方法来组合它们,使 Decimal.hour 值匹配,然后 NA当某些行没有任何数据时,将输入值。

我环顾四周,发现这里有人说可以工作的代码:

dfNew<-dplyr::bind_rows(df1, df2)

然而,它给我的是十进制列合并,但第二个数据框只有所有 NA 值。

我也试过了:

smartbind(df1, df2)

但它给了我同样的问题,df2 具有所有 NA 值。

我想知道是否有人可以帮助我解决这个问题,因为我实际拥有的数据框对于 df1 有 2160 行和 4 列,对于 df2 有 485 行和 36 列,所以需要一些帮助来理解为什么我的合并是'不正确。我从来没有必要合并这些类型的不均匀数据帧,因此我为什么要苦苦挣扎。

谢谢

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:
    library(dplyr)
    df3 <- left_join(df1, df2, by="Decimal.hour")
    

    将来可能有用:https://rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf

    【讨论】:

    • 哇,Zen 先生,您这么快就给了我一个解决方案,非常感谢。在过去的 3 个小时里,我一直在努力寻找解决方案,然后再在这里提问。我肯定会保存 pdf 链接。再次感谢!
    • 我确实有一个问题,如果您知道为什么会这样,如果您不介意添加。在我使用该代码之后,它们已成功组合,但是没有 NA 值存在,就好像 R 刚刚生成或重复数字,这意味着现在当我添加“计数”列时,额外的数字已添加。例如,df1 的总计数为 30,但是当我将 df1 与 df2 合并时,计数现在变为 40,即使 df2 没有计数列。为什么会发生这种情况?
    • 很可能是因为Decimal.hour 有重复值。如果行 Decimal.hour 不是唯一的,则无法唯一合并,left_join 将重复行(例如,如果您有多个 4.1 实例)。
    • 嗯,我明白了,那还有其他方法吗?因为我基本上只需要将 df2 中的 3 列添加到 df1,但与“十进制小时”列匹配,从而避免重复,而是在单元格中使用 NA 值
    【解决方案2】:

    基本 R 选项正在使用 merge

    merge(df1, df2, by="Decimal.hour", all = TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-20
      • 2018-03-21
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2012-11-26
      • 2016-08-12
      相关资源
      最近更新 更多