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

时间:2017-10-19 19:48:56

标签: r

我有多个已经读入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'必须是字符串或连接

任何人都可以帮助我知道这样做的正确方法是什么?

4 个答案:

答案 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.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"

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(.))