in `bind_cols()`: ! Can't recycle `..1` (size 1632) to match `..2` (size 0). Run...
🚨 错误信息
> 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)。尝试将不同大小的数据框绑定在一起导致了此错误。
解决方案
在循环外初始化df 为 NULL,或者在第一次循环时直接将 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_dfr或map_dfc函数,它们能更优雅地处理批量数据读取和合并。