![](/img/trans.png)
[英]Compare one csv file to multiple csv files and write new csv files R
[英]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.csv
和pqr.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.