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解决方案

``R
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

R
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 文件结构一致)

R
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` 函数,它们能更优雅地处理批量数据读取和合并。