我有多个已经读入R的csv文件。现在我想将所有这些文件附加到一个文件中。我尝试了一些事情,但得到了不同的错误有人可以帮我这个吗?
尝试1:
mydata <- rbind(x1,x2,x3,x4,x5,x6,x7,x8)
在哪里XI,X2 .... X8我读入R的CSV文件,我得到的错误是
错误1:在[<-.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'必须是字符串或连接
任何人都可以帮助我知道这样做的正确方法是什么?
答案 0 :(得分:2)
上面接受的答案会产生注释中显示的错误,因为do.call需要“ fullpath”参数。使用显示的代码在您选择的目录中使用:
数据集<-do.call(“ rbind”,lapply(fullpath,FUN = function(files){read.csv(files)}))
答案 1 :(得分:1)
示例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文件的文件
注意强>
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"
MERGE 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
答案 2 :(得分:1)
您可以使用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()
来提升性能。
答案 3 :(得分:0)
如何一次导入单个文件夹中的所有文件并按行绑定(例如,每个文件的格式相同。)
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(.))