in `bind_cols()`: ! Can't recycle `..1` (size 1632) to match `..2` (size 0). Run...

2025年09月19日 23:15 响应: 3.36秒 状态: success

🚨 错误信息

> a <- list.files(full.names = T,pattern = "\\.csv$") > df <- data.frame() > for (i in a) { + temp <- read.csv(i) + df <- bind_cols(temp,df) + } Error in `bind_cols()`: ! Can't recycle `..1` (size 1632) to match `..2` (size 0). Run `rlang::last_trace()` to see where the error occurred.

🤖 AI解决方案

Error in `bind_cols()`:
! Can't recycle `..1` (size 1632) to match `..2` (size 0).
Run `rlang::last_trace()` to see where the error occurred.

原因分析

bind_cols 函数要求所有输入的数据框具有相同的行数。在第一次循环时,df 是一个空数据框(大小为 0),而 temp 是从 CSV 文件读取的数据框(大小为 1632)。尝试将不同大小的数据框绑定在一起导致了此错误。

解决方案

在循环外初始化 dfNULL,或者在第一次循环时直接将 temp 赋值给 df,而不是使用 bind_cols

方法一:初始化为 NULL

a <- list.files(full.names = T, pattern = "\\.csv$")
df <- NULL # 初始化为 NULL
for (i in a) {
  temp <- read.csv(i)
  if (is.null(df)) {
    df <- temp # 第一次循环时直接赋值
  } else {
    df <- bind_cols(df, temp) # 后续循环使用 bind_cols
  }
}

方法二:直接赋值(如果 CSV 文件结构一致)

a <- list.files(full.names = T, pattern = "\\.csv$")
# 读取第一个文件来初始化 df
if (length(a) > 0) {
  df <- read.csv(a[1])
  # 从第二个文件开始循环合并
  if (length(a) > 1) {
    for (i in a[2:length(a)]) {
      temp <- read.csv(i)
      df <- bind_cols(df, temp)
    }
  }
} else {
  df <- data.frame() # 如果没有 CSV 文件,则创建一个空数据框
}

预防措施

  • 检查数据初始化:在循环中合并数据框之前,确保目标数据框已正确初始化,并且其维度与要合并的数据框兼容。
  • 批量读取和处理:对于大量的 CSV 文件,考虑使用 purrr 包的 map_dfrmap_dfc 函数,它们能更优雅地处理批量数据读取和合并。