前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R tips:使用lapply和do.call读取并合并多个文件

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

作者头像
生信菜鸟团
发布2020-05-17 23:11:20
3.9K0
发布2020-05-17 23:11:20
举报
文章被收录于专栏:生信菜鸟团

在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来手动将数字转换回来。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档