【问题标题】:Merging two data frames without duplicating metric values合并两个数据帧而不重复度量值
【发布时间】:2020-05-16 16:50:53
【问题描述】:

我有两个数据框,我想按领导值合并它们,这样我就可以看到每个组的总跑步和步行。每个领导者的团队中可以有多个成员,但我遇到的问题是,当我合并他们时,指标也会复制到新添加的行中。

这是我拥有的两个数据集的示例:

数据集 1:

+-------------+-----------+------------+-------------+
| leader name | leader id | total runs | total walks |
+-------------+-----------+------------+-------------+
| ab          |        11 |          4 |           9 |
| tg          |        47 |          8 |           3 |
+-------------+-----------+------------+-------------+

数据集 2:

+-------------+-----------+--------------+-----------+
| leader name | leader id | member name  | member id |
+-------------+-----------+--------------+-----------+
| ab          |        11 | gfh          |       589 |
| ab          |        11 | tyu          |       739 |
| tg          |        47 | rtf          |       745 |
| tg          |        47 | jke          |       996 |
+-------------+-----------+--------------+-----------+

我想把两个数据集合并成这样:

+-------------+-----------+--------------+------------+------------+-------------+
| leader name | leader id | member name  | member id  | total runs | total walks |
+-------------+-----------+--------------+------------+------------+-------------+
| ab          |        11 | gfh          |        589 |          4 |           9 |
| ab          |        11 | tyu          |        739 |            |             |
| tg          |        47 | rtf          |        745 |          8 |           3 |
| tg          |        47 | jke          |        996 |            |             |
+-------------+-----------+--------------+------------+------------+-------------+

但现在我不断得到:

+-------------+-----------+--------------+------------+------------+-------------+
| leader name | leader id | member name  | member id  | total runs | total walks |
+-------------+-----------+--------------+------------+------------+-------------+
| ab          |        11 | gfh          |        589 |          4 |           9 |
| ab          |        11 | tyu          |        739 |          4 |           9 |
| tg          |        47 | rtf          |        745 |          8 |           3 |
| tg          |        47 | jke          |        996 |          8 |           3 |
+-------------+-----------+--------------+------------+------------+-------------+

只要值不重复,它们是空白、NA 还是 0 都没有关系。有没有办法做到这一点?

【问题讨论】:

    标签: r dataframe merge duplicates


    【解决方案1】:

    我们可以在 left_join 之后的那些“总计”列上执行replace

    library(dplyr)
    left_join(df2, df1 ) %>%
          group_by(leadername) %>%
          mutate_at(vars(starts_with('total')), ~ replace(., row_number() > 1, NA))
    # A tibble: 4 x 6
    # Groups:   leadername [2]
    #  leadername leaderid membername memberid totalruns totalwalks
    #  <chr>         <dbl> <chr>         <dbl>     <dbl>      <dbl>
    #1 ab               11 gfh             589         4          9
    #2 ab               11 tyu             739        NA         NA
    #3 tg               47 rtf             745         8          3
    #4 tg               47 jke             996        NA         NA
    

    或者不使用group_by

    left_join(df2, df1 ) %>%
         mutate_at(vars(starts_with('total')), ~ 
             replace(., duplicated(leadername), NA))
    

    或者base R 选项是

    out <- merge(df2, df1, all.x = TRUE)
    i1 <- duplicated(out$leadername)
    out[i1, c("totalruns", "totalwalks")] <- NA
    out
    #  leadername leaderid membername memberid totalruns totalwalks
    #1         ab       11        gfh      589         4          9
    #2         ab       11        tyu      739        NA         NA
    #3         tg       47        rtf      745         8          3
    #4         tg       47        jke      996        NA         NA
    

    数据

    df1 <- structure(list(leadername = c("ab", "tg"), leaderid = c(11, 47
    ), totalruns = c(4, 8), totalwalks = c(9, 3)), class = "data.frame", row.names = c(NA, 
    -2L))
    
    df2 <- structure(list(leadername = c("ab", "ab", "tg", "tg"), leaderid = c(11, 
    11, 47, 47), membername = c("gfh", "tyu", "rtf", "jke"), memberid = c(589, 
    739, 745, 996)), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

    • 如果要按多列分组,例如leadername和date,我是在group_byleft_join参数by中添加附加变量吗?
    • @JaniceLuong 在group_by 中,您可以添加新的列名group_by(leadername, date),在left_join 中也可以指定要与by 连接的列。在这里,我没有使用by作为'df1','df2',常见的列名是自动拾取的
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2019-02-27
    • 2020-06-24
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多