在R中做数据处理时,数据导入导出是常见操作,对于导入而言,如果源数据保存在多个文件中,那么导入后首先就需要进行合并操作。
这个读取及合并操作可以使用lapply
和do.call
来完成。
示例如下:
代码语言:text复制###1. 先模拟几个数据文件,以用于导入###
# 创建6个文件,每个文件有一个数据框,为一行三列数据,列名a,b,c
dir.create("test")
lapply(1:6, function(x){
df <- data.frame(a=x,b=x,c=x)
write.table(df, file=paste0("test/",x,".txt"), row.names = F)
})
###2. lapply读入6个文件,并使用do.call来调用rbind去合并6个文件###
library(magrittr)
# 读入数据
file_list <- list.files("test", full.names = T)%>%lapply(function(x){
read.table(x, header = T)
})
# 使用rbind合并
do.call(rbind, file_list)
#结果如下:
# a b c
#1 1 1 1
#2 2 2 2
#3 3 3 3
#4 4 4 4
#5 5 5 5
#6 6 6 6
这个方法很好用,有一个小问题:当数据的列名不一样时,rbind
会报错,比如:
# 更改第一个数据框的列名为"d" "e" "f"
colnames(file_list[[1]])<-c("d","e","f")
do.call(rbind, file_list)
#Error in match.names(clabs, names(xi)) :
# names do not match previous names
这个时候,可以手动打开原文件,然后修改列名,也可以将数据框转换为matrix
,比如:
file_mat <- lapply(file_list, as.matrix)
do.call(rbind, file_mat) #可以运行
# d e f
#[1,] 1 1 1
#[2,] 2 2 2
#[3,] 3 3 3
#[4,] 4 4 4
#[5,] 5 5 5
#[6,] 6 6 6
当转换为matrix
的时候,由于matrix
内的格式都是一样的,一旦原文件包含字符和数字,那么数字也会转换为字符,此时需要as.numeric
来手动将数字转换回来。