R语言 按行名称合并多个数据框

raogr8fs  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(255)

我正在做一个项目,我有50个结构相同的数据库。
请按照以下方式考虑

df_1 <- data.frame(nationality=c("german","italian"), total=c(500,300), male=c(400,100))
df_2 <- data.frame(nationality=c("german","italian"), total=c(800,600), male=c(300,80))

等等。
基本上,每个数据框包含一个特定年份的数据。我现在希望每个国家有一个数据框,其中每列代表一年。总体目标是有一个时间数据图。
我无法找到这个问题的解决方案,特别是因为我有太多的 Dataframe 。我读到过将它们都放在一个列表中然后处理它是有意义的,但我不完全确定这是否有意义。
任何帮助都是高度赞赏,我是相对新的R!

vdzxcuhz

vdzxcuhz1#

一种方法,首先在列表的每个数据框中添加年份,然后按 * 国籍 * 分列。

library(dplyr)

years <- c(2022, 2023) # one year per data frame

df_list <- list(df_1, df_2)

lapply(1:length(df_list), function(x) cbind(df_list[[x]], year=years[x])) %>% 
  bind_rows() %>% 
  group_split(nationality)

输出

<list_of<
  tbl_df<
    nationality: character
    total      : double
    male       : double
    year       : integer
  >
>[2]>
[[1]]
# A tibble: 2 × 4
  nationality total  male  year
  <chr>       <dbl> <dbl> <int>
1 german        500   400  2022
2 german        800   300  2023

[[2]]
# A tibble: 2 × 4
  nationality total  male  year
  <chr>       <dbl> <dbl> <int>
1 italian       300   100  2022
2 italian       600    80  2023
q3qa4bjr

q3qa4bjr2#

正如Jon Spring所要求的,您必须在加入之前使用年份注解数据框,例如,如果您的数据框位于命名列表中,其中名称表示年份:

all_years <- list(year1 = df_1, year2 = df_2)

你可以在tidyverse中做一些事情,比如:

library(tidyverse)
all_years %>% 
  names() %>% 
  map(\(year)
      {all_years[[year]] %>% rename_with(~paste(., year, sep="_"),
                                         -nationality)}) %>% 
  purrr::reduce(left_join, by="nationality") %>% 
  pivot_longer(-nationality, names_to="population_year") %>% 
  separate("population_year", c("population", "year"), sep="_") %>% 
  pivot_wider(id_cols = c(population,nationality), 
              names_from = year, 
              values_from = value) %>% 
  group_split(nationality) %>% 
  set_names(map(., ~.$nationality[1]))

生成的tibble列表包含

$german
# A tibble: 2 × 4
  population nationality year1 year2
  <chr>      <chr>       <dbl> <dbl>
1 total      german        500   800
2 male       german        400   300

$italian
# A tibble: 2 × 4
  population nationality year1 year2
  <chr>      <chr>       <dbl> <dbl>
1 total      italian       300   600
2 male       italian       100    80

这个解决方案使用了一个连接(而不是绑定)操作,这样在 Dataframe 格式不相同的情况下会更安全,例如ncol不同。

相关问题