【问题标题】:Not the easiest merge in R不是 R 中最简单的合并
【发布时间】:2020-11-08 12:46:26
【问题描述】:

我认为在我上次的尝试中,我解释得太复杂了,所以我尽量减少我的问题。

我正在寻找以下问题的解决方案。我有两个数据框,想从最后的数据框“df_result”中获取结果。

df_1 = data.frame(id=c(1, 15, 14, 35, 19, 19, 36, 18, 57, 78, 94), year=c(2018, 2020, 2019, 2020, 2018, 2020, 2017, 2019, 2020, 2019, 2018))

df_2 = data.frame(id=c(1, 15, 15, 14, 35, 19, 19, 19, 19, 19, 36, 18, 57, 78, 94), year=c(2018, 2020, 2020, 2019, 2020, 2018, 2018, 2018, 2020, 2020, 2017, 2019, 2020, 2019, 2018), color=c("green", "blue", "yellow", "green", "red", "black", "white", "orange", "yellow", "blue", "blue", "yellow", "white", "blue", "green"), weight=c(NA, 2, 1, NA, NA, 2, 3, 1, 1, 2, NA, NA, NA, NA, NA))

df_result = data.frame(id=c(1, 15, 14, 35, 19, 19, 36, 18, 57, 78, 94), year=c(2018, 2020, 2019, 2020, 2018, 2020, 2017, 2019, 2020, 2019, 2018), result=c("green", "yellow", "green", "red", "orange", "yellow", "blue", "yellow", "white", "blue", "green"))

信息:

  • 正如您在 df_1 中看到的,每个 id 至少有一年。例如,id 19 有 2 年(2018 年、2020 年)。
  • df_2 的每个 id 至少有 1 个条目,并且具有匹配的年份。如果有多个条目,“权重”表示哪个条目具有优先级(1 表示最高优先级)。
  • 在 df_result 中,只有来自 df_2 的权重具有最小数字的颜色。

我知道如何找到问题案例,但下一步是什么?

df_temp <- df_2 %>% 
  group_by(id) %>%
  filter(n() >= 2)
view(df_temp)

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    df_1加入df_2,按权重排列数据后选择第一行。

    library(dplyr)
    
    df_2 %>%
      left_join(df_1, by = c('id', 'year')) %>%
      arrange(id, weight) %>%
      group_by(id, year) %>%
      slice(1L) %>%
      dplyr::select(-weight) %>%
      ungroup
    
    # A tibble: 11 x 3
    #      id  year color 
    #   <dbl> <dbl> <chr> 
    # 1     1  2018 green 
    # 2    14  2019 green 
    # 3    15  2020 yellow
    # 4    18  2019 yellow
    # 5    19  2018 orange
    # 6    19  2020 yellow
    # 7    35  2020 red   
    # 8    36  2017 blue  
    # 9    57  2020 white 
    #10    78  2019 blue  
    #11    94  2018 green 
    

    【讨论】:

    • 谢谢。我将立即在正确的数据框中对此进行测试。我想到的另一件事是:我的 df_2 还包含 df_1 中未包含的 id。这些不得出现在结果中。
    • 您可以将 left_join 更改为 inner_join 以仅包含出现在两者中的 id。
    猜你喜欢
    • 2011-12-04
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2021-12-13
    • 2014-12-24
    相关资源
    最近更新 更多