首页 > 解决方案 > rbind 具有不同列名的多个 csv 文件 R

问题描述

我有一个包含 107 个 csv 文件(3560 行 x 13 列)的列表,我想将它们组合在一个长数据框中final_df。它们共享相同的结构,但最后三列在每个文件中的标记不同。

A = c("one", "two", "three","four","five") 
B = c(1, 2, 3, 4, 5) 
C = c(34,11,3,45,65)
D = c(7,1,88,95,13)
J_1 = c(23,6,8,15,54)
J_2 = c(2,54,69,95,45)
J_3 = c(9,10,11,5,14)
W_1 = c(23,6,8,15,54)
W_2 = c(2,54,69,95,45)
W_3 = c(9,10,11,5,14)

file_1 <- data.frame(A,B,C,D,J_1,J_2,J_3)
file_2 <- data.frame(A,B,C,D,W_1,W_2,W_3)

我尝试将它们列出并通过 for 循环传递它们,在该循环中我可以使用固定向量(colnames)更改行名,以便具有相同的列名并能够使用函数 rbind,但没有运气。

colnames = c("A", "B", "C", "D", "X_1", "X_2", "X_3")
names(i) <- colnames

此外,我想添加一个额外的列来final_df$filename存储文件名(可能没有路径和 .csv),以免丢失有关数据来源的信息。

我的预期结果理想情况下是这样的:

      A B  C  D X_1 X_2 X_3 filename
1    one 1 34  7  23   2   9   file_1
2    two 2 11  1   6  54  10   file_1
3  three 3  3 88   8  69  11   file_1
4   four 4 45 95  15  95   5   file_1
5   five 5 65 13  54  45  14   file_1
6    one 1 34  7  23   2   9   file_2
7    two 2 11  1   6  54  10   file_2
8  three 3  3 88   8  69  11   file_2
9   four 4 45 95  15  95   5   file_2
10  five 5 65 13  54  45  14   file_2

在此先感谢您的帮助!

标签: listfor-looprbind

解决方案


我使用下面的代码进行了管理,即使我必须将 .csv 保留在文件名中。

解决方案:

list_of_files <- list.files(path, pattern = "\\.csv$", all.files=FALSE,full.names =TRUE)

final_df <- c()

columnnames <- colnames = c("A", "B", "C", "D", "X_1", "X_2", "X_3")

for(i in 1:length(list_of_files)){
  
  file <- list_of_files[i]
  var <- read.csv(file)
  names(var) <- columnnames
  var$filename <-paste(sapply(strsplit(as.character(list_of_files[i]),'_'), "[", 13))
  final_df <- rbind(final_df,var)
}

推荐阅读