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一年的功能
- 我不能运行 df2 (polity) 和 df3 (gdp) 同时使用 %>% 的函数
- 我无法根据 df1 中的年份设置 df1 中的新列名(例如“polity_year1”或“gdp_year2”)
如有任何帮助,我们将不胜感激。
您的 df1
数据集的问题 ID 不是整齐的数据格式,这意味着每一行是一个观察值,每一列是一个变量。相反,在您的 df1 中,变量 year、gdp 和 polity_score 分布在两列中。因此,要解决您的任务,最好在加入之前先重塑您的数据。为此,我使用了 tidyr
包中的 pivot_longer
和 pivot_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
如果满足某些条件,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一年的功能
- 我不能运行 df2 (polity) 和 df3 (gdp) 同时使用 %>% 的函数
- 我无法根据 df1 中的年份设置 df1 中的新列名(例如“polity_year1”或“gdp_year2”)
如有任何帮助,我们将不胜感激。
您的 df1
数据集的问题 ID 不是整齐的数据格式,这意味着每一行是一个观察值,每一列是一个变量。相反,在您的 df1 中,变量 year、gdp 和 polity_score 分布在两列中。因此,要解决您的任务,最好在加入之前先重塑您的数据。为此,我使用了 tidyr
包中的 pivot_longer
和 pivot_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