R tips:使用lapply和do.call读取并合并多个文件

2020-05-17 23:11:20 浏览数 (3)

在R中做数据处理时,数据导入导出是常见操作,对于导入而言,如果源数据保存在多个文件中,那么导入后首先就需要进行合并操作。

这个读取及合并操作可以使用lapplydo.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会报错,比如:

代码语言:text复制
# 更改第一个数据框的列名为"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,比如:

代码语言:javascript复制
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来手动将数字转换回来。

0 人点赞