【问题标题】:How to left_join in R and repeat joining value to multiple variables?如何在 R 中 left_join 并将值重复加入多个变量?
【发布时间】:2019-11-20 20:09:29
【问题描述】:

我在这里混淆了一些东西,要么这不是正确的方法,要么我错过了 left_join 的一部分:

我希望按国家和年份加入“gdp”列,并在所有三个“性别”类别中重复该值,以使同一年的所有三个性别都具有相同的关联 gdp .

这是我现在拥有的:

library(tidyverse)

table_1 <- tribble(~"Region",~"Country",~"Year", ~"Gender", ~"median_rate",
 "Central and Southern Asia", "Afghanistan",  2011, "female",       0.186,
"Central and Southern Asia","Afghanistan",  2011, "male",         0.454,
 "Central and Southern Asia", "Afghanistan",  2011, "total",        0.274,
 "Central and Southern Asia", "Afghanistan",  2018, "female",       0.221,
 "Central and Southern Asia", "Afghanistan" , 2018, "male",         0.504,
 "Central and Southern Asia", "Afghanistan",  2018, "total",        0.367)

table_2 <- tribble(~"Country",    ~"gdp", ~"Year",
 "Afghanistan",  551.,  2010,
 "Afghanistan", 599.,2011,
 "Afghanistan",  649.,  2012,
 "Afghanistan",  648.,  2013,
 "Afghanistan",  625.,  2014,
 "Afghanistan",  590.,  2015,
 "Afghanistan",  550.,  2016,
 "Afghanistan",  550.,  2017)

table_1 %>% left_join(table_2, by = "Country")

# A tibble: 48 x 7
   Region                    Country     Year.x Gender median_rate   gdp Year.y
   <chr>                     <chr>        <dbl> <chr>        <dbl> <dbl>  <dbl>
 1 Central and Southern Asia Afghanistan   2011 female       0.186   551   2010
 2 Central and Southern Asia Afghanistan   2011 female       0.186   599   2011
 3 Central and Southern Asia Afghanistan   2011 female       0.186   649   2012
 4 Central and Southern Asia Afghanistan   2011 female       0.186   648   2013
 5 Central and Southern Asia Afghanistan   2011 female       0.186   625   2014
 6 Central and Southern Asia Afghanistan   2011 female       0.186   590   2015
 7 Central and Southern Asia Afghanistan   2011 female       0.186   550   2016
 8 Central and Southern Asia Afghanistan   2011 female       0.186   550   2017
 9 Central and Southern Asia Afghanistan   2011 male         0.454   551   2010
10 Central and Southern Asia Afghanistan   2011 male         0.454   599   2011
# ... with 38 more rows

预期的输出将是这样的,将表 2 中的 gdp 列加入,但仅针对每个匹配的年份,(例如,表 1 中只有 2011 年和 2018 年的数据,因此应该只匹配这些年份)

tribble(~"Region",~"Country",~"Year", ~"Gender", ~"median_rate",~"gdp",
        "Central and Southern Asia", "Afghanistan",  2011, "female",0.186, 550,
        "Central and Southern Asia","Afghanistan",  2011, "male",0.454,550,
        "Central and Southern Asia", "Afghanistan",  2011, "total",0.274,550,
        "Central and Southern Asia", "Afghanistan",  2018, "female", 0.221,590,
        "Central and Southern Asia", "Afghanistan" , 2018, "male",         0.504, 590,
        "Central and Southern Asia", "Afghanistan",  2018, "total",        0.367, 590)


感谢您的帮助,

【问题讨论】:

  • 你能显示你的预期输出吗
  • “按国家和年份加入“gdp”列”建议您应该使用%&gt;% left_join(table_2, by = c("Country", "Year"))。此外,查看您的输出,您有字段Year.xYear.y,提醒您两边都有Year
  • @r2evans 就是这样。谢谢。不知道您可以在“by”参数中传递两个变量。如果您想提交,请提交。

标签: r dplyr


【解决方案1】:

dplyr's join verbs' by= 参数可以接受多于一列:

table_1 <- tribble(~"Region",~"Country",~"Year", ~"Gender", ~"median_rate",
 "Central and Southern Asia", "Afghanistan",  2011, "female",       0.186,
 "Central and Southern Asia","Afghanistan",  2011, "male",         0.454,
 "Central and Southern Asia", "Afghanistan",  2011, "total",        0.274,
 "Central and Southern Asia", "Afghanistan",  2018, "female",       0.221,
 "Central and Southern Asia", "Afghanistan" , 2018, "male",         0.504,
 "Central and Southern Asia", "Afghanistan",  2018, "total",        0.367)

table_2 <- tribble(~"Country",    ~"gdp", ~"Year",
 "Afghanistan",  551.,  2010,
 "Afghanistan", 599.,2011,
 "Afghanistan",  649.,  2012,
 "Afghanistan",  648.,  2013,
 "Afghanistan",  625.,  2014,
 "Afghanistan",  590.,  2015,
 "Afghanistan",  550.,  2016,
 "Afghanistan",  550.,  2017)

table_1 %>% left_join(table_2, by = c("Country", "Year"))
# # A tibble: 6 x 6
#   Region                    Country      Year Gender median_rate   gdp
#   <chr>                     <chr>       <dbl> <chr>        <dbl> <dbl>
# 1 Central and Southern Asia Afghanistan  2011 female       0.186   599
# 2 Central and Southern Asia Afghanistan  2011 male         0.454   599
# 3 Central and Southern Asia Afghanistan  2011 total        0.274   599
# 4 Central and Southern Asia Afghanistan  2018 female       0.221    NA
# 5 Central and Southern Asia Afghanistan  2018 male         0.504    NA
# 6 Central and Southern Asia Afghanistan  2018 total        0.367    NA

【讨论】:

    【解决方案2】:

    我们也可以使用base R中的merge

    merge(table_1, table_2, by = c("Country", "Year"), all.x = TRUE)
    #      Country Year                    Region Gender median_rate gdp
    #1 Afghanistan 2011 Central and Southern Asia female       0.186 599
    #2 Afghanistan 2011 Central and Southern Asia   male       0.454 599
    #3 Afghanistan 2011 Central and Southern Asia  total       0.274 599
    #4 Afghanistan 2018 Central and Southern Asia female       0.221  NA
    #5 Afghanistan 2018 Central and Southern Asia   male       0.504  NA
    #6 Afghanistan 2018 Central and Southern Asia  total       0.367  NA
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2016-11-29
      • 2023-03-27
      • 2021-03-06
      • 2022-01-18
      • 2017-02-08
      相关资源
      最近更新 更多