如何在R中选取多个数据框指定列并合并为单个数据框?
问题分析与解决方法
原代码的问题
- 自定义的
select_function没有把输入参数x传递给dplyr::select,函数无法识别要操作的数据框。 lapply调用时只是把函数本身放进了列表,没有实际执行函数对数据框进行子集化,正确做法是调用函数并传入数据框参数。- 用
list作为变量名不合适,这是R的内置函数,容易引发冲突,建议换成df_list这类名称。
修正后的基础解法
先修正自定义函数和lapply的调用逻辑:
# 创建数据框 df1 <- matrix(1:12, 3,4, dimnames = list(NULL, LETTERS[1:4])) df2 <- matrix(12:26, 3, 5, dimnames = list(NULL, LETTERS[1:5])) df1 <- as.data.frame(df1) df2 <- as.data.frame(df2) # 修正自定义函数:传入参数x,并在select中使用 select_function <- function(x){ dplyr::select(x, A, C, D) } # 使用合适的变量名 df_list <- list(df1, df2) # lapply中调用函数并传递参数 df_subset_list <- lapply(df_list, select_function) # 合并数据框,dplyr::bind_rows能自动匹配列名 new_df <- dplyr::bind_rows(df_subset_list)
更优雅的简化写法
不需要单独定义函数,直接在lapply里嵌套select,或者用purrr包的map函数(属于tidyverse生态,代码更简洁):
# 方法1:用lapply直接调用select df_subset_list <- lapply(df_list, function(x) dplyr::select(x, A, C, D)) # 方法2:用purrr::map(需先安装purrr包) library(purrr) df_subset_list <- map(df_list, ~dplyr::select(.x, A, C, D)) # 合并数据框 new_df <- dplyr::bind_rows(df_subset_list)
Base R 实现方式
如果不想用dplyr,用Base R的子集化语法也能实现:
# 用[]进行列选取,指定列名向量 df_subset_list <- lapply(df_list, `[`, c("A", "C", "D")) # 合并数据框 new_df <- do.call(rbind, df_subset_list)
内容的提问来源于stack exchange,提问作者Victor Shin
相关产品推荐
相关产品推荐

