如何基于其他两个 Dataframe 创建 Dataframe 列表

j5fpnvbx  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(106)

我有两个 Dataframe 。第一个有数千列,代表一个给定的城市,后面跟着一年,像“伦敦_2001”,“伦敦_2002”,行中有一些测量值。第二个 Dataframe 有两列。第一个是领土区域,第二个是城市列表。类似于:

df1 <- data.frame(London_2021 = c(3,6,83,25,4),
                  London_2022 = c(3,6,83,25,4),
                  Berlin_2021 = c(3,6,83,25,4),
                  Berlin_2022 = c(3,6,83,25,4),
                  BerlinSuburbs_2021 = c(3,6,83,25,4),
                  BerlinSuburbs_2022 = c(3,6,83,25,4),
                  Tokyo_2021 = c(3,6,83,25,4),
                  Tokyo_2022 = c(3,6,83,25,4))

df2 <- data.frame(TerritorialRegion = c("Pacific", "Europe"),
                  Cities = c("Tokyo", "London, Berlin"))

我想创建一个列表,列表中的每个元素都是一个 Dataframe 。这个 Dataframe 将被称为领土区域,并将每个城市作为列。
在这种情况下,您的列表将类似于:

List
 [1] Pacific
 [2] Europe

如果你以list[2]的方式访问欧洲,你会得到:

London_2021 | London_2022 | Berlin_2021 | Berlin_2022

正如您所看到的,我们需要严格相同的名称,因此BerlibSuburbs不会出现在我们的 Dataframe 中,
我试过了,但不起作用:

library(dplyr)
library(tidyr)

# step 1
df2 <- df2 %>% 
  separate_rows(Cities, sep = ",\\s*")

# step 2
df1_long <- df1 %>% 
  pivot_longer(cols = everything(), 
               names_to = c("City", "Year"), 
               names_sep = "_")

# step 3
df_merged <- df2 %>% 
  left_join(df1_long, by = c("Cities" = "City"))

# step 4
df_list <- df_merged %>% 
  split(.$TerritorialRegion)
7kqas0il

7kqas0il1#

您可以使用purrrMap和dplyr::select获得此输出

purrr::map(df2$Cities, function(x) {
  select(df1, starts_with(paste0(strsplit(x, ",\\s*")[[1]], "_")))
}) |> 
  purrr::set_names(df2$TerritorialRegion)

其返回

$Pacific
  Tokyo_2021 Tokyo_2022
1          3          3
2          6          6
3         83         83
4         25         25
5          4          4

$Europe
  London_2021 London_2022 Berlin_2021 Berlin_2022
1           3           3           3           3
2           6           6           6           6
3          83          83          83          83
4          25          25          25          25
5           4           4           4           4

相关问题