You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:保留新增列并补充命名

如果需要保留新增列,先查看样本文件的列结构,更新命名向量:

  1. 先读取一个样本文件,获取当前所有列名:
sample_data <- read_excel(file_paths[1])
colnames(sample_data)
  1. 根据输出的列名,补充新增列的命名,确保向量长度与列数一致:
# 假设原命名向量是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:30:51