繁体   English   中英

使用R将多个csv文件附加到一个文件中

[英]Append multiple csv files into one file using R

我有多个已读入 R 的 csv 文件。现在我想将所有这些文件附加到一个文件中。 我尝试了几件事,但遇到了不同的错误。 任何人都可以帮我解决这个问题吗?

尝试 1:

mydata <- rbind(x1,x2,x3,x4,x5,x6,x7,x8)

哪里 XI,X2....X8 我读入 R 的 CSV 文件,我得到的错误是

错误 1 ​​:In [<-.factor ( *tmp* , ri, value = c(NA, NA, NA, NA, NA, NA, NA, : 无效因子水平,NA 生成

尝试 2:然后我以另一种方式尝试:

mydata1<- c(x1,x2,x3,x4,x5,x6,x7,x8)
> mydata2 <- do.call('rbind',lapply(mydata1,read.table,header=T))

错误 2:在 FUN(X[[i]], ...) 中:'file' 必须是字符串或连接

任何人都可以帮我知道什么是正确的方法吗?

如何一次从单个文件夹导入所有文件并按行绑定(例如,每个文件的格式相同。)

library(tidyverse)

 list.files(path = "location_of/data/folder_you_want/",
              pattern="*.csv", 
              full.names = T) %>% 
    map_df(~read_csv(.))

如果有要排除的文件,则

list.files(path = "location_of/data/folder_you_want/",
              pattern="*.csv", 
              full.names = T) %>% 
    .[ !grepl("data/folder/name_of_file_to_remove.csv",  .) ] %>%
    map_df(~read_csv(.))

示例 CSV 文件

笔记
这里要合并的 CSV 文件有
- 列数相等
- 相同的列名
- 相同的列顺序
- 行数可以不同

第一个 csv 文件abc.csv

A,B,C,D
1,2,3,4
2,3,4,5
3,4,5,6
1,1,1,1
2,2,2,2
44,44,44,44
4,4,4,4
4,4,4,4
33,33,33,33
11,1,11,1  

第二个 csv 文件pqr.csv

 A,B,C,D
 1,2,3,40
 2,3,4,50
 3,4,50,60
 4,4,4,4
 5,5,5,5
 6,6,6,6   

列出 CSV 文件的 FILENAMES

笔记
E:/MergeCSV/下面的路径只有要合并的文件。 没有其他 csv 文件。 所以在这个路径中,只有两个csv文件, abc.csvpqr.csv

## List filenames to be merged. 
filenames <- list.files(path="E:/MergeCSV/",pattern="*.csv")

## Print filenames to be merged
print(filenames)
## [1] "abc.csv" "pqr.csv"

CSV 文件的完整路径

## Full path to csv filenames
fullpath=file.path("E:/MergeCSV",filenames)

## Print Full Path to the files
print(fullpath)
## [1] "E:/MergeCSV/abc.csv" "E:/MergeCSV/pqr.csv"

合并 CSV 文件

## Merge listed files from the path above
dataset <- do.call("rbind",lapply(filenames,FUN=function(files){ read.csv(files)}))

## Print the merged csv dataset, if its large use `head()` function to get glimpse of merged dataset
dataset
#     A  B  C  D
# 1   1  2  3  4
# 2   2  3  4  5
# 3   3  4  5  6
# 4   1  1  1  1
# 5   2  2  2  2
# 6  44 44 44 44
# 7   4  4  4  4
# 8   4  4  4  4
# 9  33 33 33 33
# 10 11  1 11  1
# 11  1  2  3 40
# 12  2  3  4 50
# 13  3  4 50 60
# 14  4  4  4  4
# 15  5  5  5  5
# 16  6  6  6  6

head(dataset)
#    A  B  C  D
# 1  1  2  3  4
# 2  2  3  4  5
# 3  3  4  5  6
# 4  1  1  1  1
# 5  2  2  2  2
# 6 44 44 44 44

## Print dimension of merged dataset
dim(dataset)
## [1] 16  4

上面接受的答案会生成注释中显示的错误,因为do.call需要"fullpath"参数。 使用所示代码在您选择的目录中使用:

dataset <- do.call("rbind",lapply(fullpath,FUN=function(files){ read.csv(files)}))

您可以组合使用 lapply() 和 do.call()。

## cd to the csv directory
setwd("mycsvs")

## read in csvs
csvList <- lapply(list.files("./"), read.csv, stringsAsFactors = F)

## bind them all with do.call
csv <- do.call(rbind, csvList)

您还可以使用data.table包中的fread()函数和rbindlist()来提高性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM