R:如何根据特定条件将值从多个数据帧传输到另一个数据帧?

R: How can I transfer values from multiple data frames to another data frame depending on certain conditions?

如果满足某些条件,R 中是否有一种方法可以将值从多个数据帧传输到第二个数据帧?具体来说,我关心以下问题:

我在数据框 1 中有不同人的价值观(列:姓名,ISO-3 中的国家,年份 1,年份 2),数据框 2 中所有国家的政体得分(列:ISO-3 中的国家,年份, score) 和数据框 3 中所有国家的 gdp(列:ISO-3 中的国家,年份,gdp)

我现在想将数据框 2 中相应的政体分数和数据框 3 中的 gdp 值作为新列添加到数据框 1 中,具体取决于第 1 年和第 2 年的国家和年份。我可以通过以下方式自动执行此操作吗R?

df1

姓名 国家 1 年 第二年 polity_year1 gdp_year1 polity_year2 gdp_year2
名称 1 美国 1990 2018 政治得分:第 1 年 gdp: year1 政治分数:第 2 年 gdp: year2
姓名 2 丹麦语 1995 1999 政治得分:第 1 年 gdp: year1 政治分数:第 2 年 gdp: year2

df2

国家 得分
美国 1990 10
美国 2018 10
丹麦语 1995 10
丹麦语 1999 10

df3

国家 国内生产总值
美国 1990 5325
美国 2018 7230
丹麦语 1995 2245
丹麦语 1999 3256

我试过 dplyr join(),

df_joined <-  left_join(df1, df2, by = c("country" = "country", "year_1" = "year"), name="polity_year1") %>%

     left_join(df1, df2, by = c("country" = "country", "year_2" = "year"),name="polity_year2") %>%

     left_join(df1, df3, by = c("country" = "country", "year_1" = "year"), name="gdp_year1") %>%

     left_join(df1, df3, by = c("country" = "country", "year_2" = "year"), name="gdp_year2")

但由于多种原因失败了

如有任何帮助,我们将不胜感激。

您的 df1 数据集的问题 ID 不是整齐的数据格式,这意味着每一行是一个观察值,每一列是一个变量。相反,在您的 df1 中,变量 year、gdp 和 polity_score 分布在两列中。因此,要解决您的任务,最好在加入之前先重塑您的数据。为此,我使用了 tidyr 包中的 pivot_longerpivot_wider

library(dplyr)
library(tidyr)

df1_tidy <- df1 %>% 
  rename(year_year1 = year1, year_year2 = year2) %>% 
  mutate(across(starts_with("year"), as.character)) %>% 
  pivot_longer(-c(name, country), names_to = c("var", "year1"), names_pattern = "^(.*)_(.*)$") %>% 
  pivot_wider(names_from = var, values_from = value) %>% 
  select(-year1) %>% 
  mutate(year = as.integer(year))

df1_tidy
#> # A tibble: 4 × 5
#>   name   country  year polity              gdp       
#>   <chr>  <chr>   <int> <chr>               <chr>     
#> 1 Name 1 USA      1990 polity score: year1 gdp: year1
#> 2 Name 1 USA      2018 polity score: year2 gdp: year2
#> 3 Name 2 DNK      1995 polity score: year1 gdp: year1
#> 4 Name 2 DNK      1999 polity score: year2 gdp: year2
df1_tidy %>% 
  left_join(df2, by = c("country", "year"), suffix = c("", "_country")) %>% 
  left_join(df3, by = c("country", "year"), suffix = c("", "_country"))
#> # A tibble: 4 × 7
#>   name   country  year polity              gdp        score gdp_country
#>   <chr>  <chr>   <int> <chr>               <chr>      <int>       <int>
#> 1 Name 1 USA      1990 polity score: year1 gdp: year1    10        5325
#> 2 Name 1 USA      2018 polity score: year2 gdp: year2    10        7230
#> 3 Name 2 DNK      1995 polity score: year1 gdp: year1    10        2245
#> 4 Name 2 DNK      1999 polity score: year2 gdp: year2    10        3256