如何在R中合并多个列表并按公共变量整理成指定数据框
解决方案
你的问题出在df_list是向量的列表,而非带列名的数据框,且full_join需要明确的连接逻辑支撑。以下两种方法可以实现你想要的结果:
方法1:长格式转宽格式(推荐,逻辑清晰)
先将所有数据整理为长格式,再转换为目标宽格式:
library(tidyverse) L1 <- c("ACRU","AHAA","ACHS","BLEH","HRFW","HWHW", "WBFW", "ZIMR") L2 <- c("ACRU","AHAA","ACHS","BLEH") L3 <- c("ACRU","HRFW","HWHW","ZIMR") L4 <- c("ACRU", "AHAA", "HWHW", "WBFW") # 给列表元素命名,对应实验变量名 df_list <- list(L1 = L1, L2 = L2, L3 = L3, L4 = L4) # 转换为目标数据框 result <- df_list %>% # 每个向量转成包含物种和变量名的 tibble imap(~ tibble(species = .x, variable = .y)) %>% # 合并所有行 bind_rows() %>% # 转成宽格式,缺失值填充为NA pivot_wider(names_from = variable, values_from = species, values_fill = NA) print(result)
运行结果:
# A tibble: 8 × 4 L1 L2 L3 L4 <chr><chr><chr><chr> 1 ACRU ACRU ACRU ACRU 2 AHAA AHAA NA AHAA 3 ACHS ACHS NA NA 4 BLEH BLEH NA NA 5 HRFW NA HRFW NA 6 HWHW NA HWHW HWHW 7 WBFW NA NA WBFW 8 ZIMR NA ZIMR NA
方法2:逐步全连接
先将每个向量转为带对应列名的数据框,再通过reduce依次全连接:
result2 <- df_list %>% # 每个向量转成单列数据框 map(~ tibble(val = .x)) %>% # 给每个数据框的列重命名为对应的变量名 imap(~ rename(.x, !!.y := val)) %>% # 依次全连接所有数据框,自动对齐所有物种 reduce(full_join, by = character()) print(result2)
该方法的输出结果与方法1完全一致。
内容的提问来源于stack exchange,提问作者Reesamu
相关产品推荐
相关产品推荐

