R中合并Excel文件时set_names列数不匹配报错求助
问题根源
报错! The size of nm (23) must be compatible with the size of x (25)是因为你用set_names()指定了固定23个列名,但Excel新增列后,读取的数据框变成了25列,列名数量与数据列数不匹配导致的。下面给出几种针对性解决方法:
解决方法1:丢弃新增列,保留原需求列
如果新增列对你的分析无意义,先精准筛选出需要的原始列,再执行后续操作,确保列数与命名向量长度一致:
library(tidyverse) library(readxl) file_paths <- list.files("你的Excel文件夹路径", pattern = "*.xlsx", full.names = TRUE) # 定义你需要保留的原始列名(从原Excel结构中提取) required_raw_cols <- c("原始列名1", "原始列名2", "...") clean_data <- map_dfr(file_paths, function(file) { read_excel(file) %>% # 只保留目标列,自动丢弃新增列 select(all_of(required_raw_cols)) %>% mutate( id = str_extract(file, "\\d+"), # 你的id提取逻辑 body_mass = 你的body_mass计算逻辑, training = 你的training计算逻辑 ) %>% # 命名向量长度 = 原始目标列数 + 3个新增字段,确保为23个 set_names(c("重命名列1", "重命名列2", "...", "id", "body_mass", "training")) })
解决方法2:保留新增列并补充命名
如果需要保留新增列,先查看样本文件的列结构,更新命名向量:
- 先读取一个样本文件,获取当前所有列名:
sample_data <- read_excel(file_paths[1]) colnames(sample_data)
- 根据输出的列名,补充新增列的命名,确保向量长度与列数一致:
# 假设原命名向量是old_names,新增2列则补充对应名字 updated_names <- c(old_names, "新增列名1", "新增列名2") # 总长度变为25 clean_data <- map_dfr(file_paths, function(file) { read_excel(file) %>% mutate( id = str_extract(file, "\\d+"), body_mass = 你的body_mass计算逻辑, training = 你的training计算逻辑 ) %>% set_names(updated_names) })
更稳健的写法:用rename()替代set_names()(推荐)
set_names()强制要求命名数量与列数完全匹配,而rename()可以只重命名你关心的列,剩余列保留原名,彻底避免列数变化导致的报错:
clean_data <- map_dfr(file_paths, function(file) { read_excel(file) %>% mutate( id = str_extract(file, "\\d+"), body_mass = 你的body_mass计算逻辑, training = 你的training计算逻辑 ) %>% # 只重命名需要调整的列,新增列自动保留原名 rename( 新列名1 = 原始列名1, 新列名2 = 原始列名2, # ... 其他需要重命名的列 ) })
内容的提问来源于stack exchange,提问作者MaxB
相关产品推荐
相关产品推荐

