在R语言中合并列表内数据框的共同列
合并列表中数据框并保留共同列
问题背景
现有如下R语言代码创建的列表对象:
df1 <- data_frame(ID = paste0(LETTERS[1],1:4), valueA = seq(0.1,0.4,0.1), Category= "Apples", valueDEF = seq(0.1,0.4,0.1), valueDEF2 = seq(0.1,0.4,0.1) ) df2 <- data_frame(ID = paste0(LETTERS[1],5:8), valueB = seq(0.1,0.4,0.1), Category= "Apples2") df3 <- data_frame(ID = paste0(LETTERS[1],9:12), valueC = seq(0.1,0.4,0.1), Category= "Apples3") list1 <- list(df1, df2, df3);list1
列表结构如下:
[[1]] # A tibble: 4 × 5 ID valueA Category valueDEF valueDEF2 <chr> <dbl> <chr> <dbl> <dbl> 1 A1 0.1 Apples 0.1 0.1 2 A2 0.2 Apples 0.2 0.2 3 A3 0.3 Apples 0.3 0.3 4 A4 0.4 Apples 0.4 0.4 [[2]] # A tibble: 4 × 3 ID valueB Category <chr> <dbl> <chr> 1 A5 0.1 Apples2 2 A6 0.2 Apples2 3 A7 0.3 Apples2 4 A8 0.4 Apples2 [[3]] # A tibble: 4 × 3 ID valueC Category <chr> <dbl> <chr> 1 A9 0.1 Apples3 2 A10 0.2 Apples3 3 A11 0.3 Apples3 4 A12 0.4 Apples3
需求是合并列表中的数据框,仅保留所有数据框共有的ID和Category列,预期输出如下:
ID Category A1 Apples A2 Apples A3 Apples A4 Apples A5 Apples2 A6 Apples2 A7 Apples2 A8 Apples2 A9 Apples3 A10 Apples3 A11 Apples3 A12 Apples3
解决方案
方法1:使用tidyverse工具包(dplyr)
借助dplyr的bind_rows按列名合并数据框,再用select筛选目标列:
library(dplyr) # 合并并筛选列 result <- bind_rows(list1) %>% select(ID, Category) # 查看结果 print(result)
方法2:使用Base R原生函数
通过lapply提取每个数据框的目标列,再用do.call(rbind, ...)合并:
# 提取指定列并合并 result <- do.call(rbind, lapply(list1, function(df) df[, c("ID", "Category")])) # 查看结果 print(result)
两种方法都能得到符合预期的输出。
内容的提问来源于stack exchange,提问作者symkly
相关产品推荐
相关产品推荐

