【R语言】大数据多文件读取与合并

简单读取与3种合并

# 读取文件 【循环读取为环境的一个个数据框】
lf <-list.files(pattern = ".csv$") 
(files <- gsub("\\.csv", "", lf))
(filesNewname=gsub(pattern = "-","_",files)) #文件名短杠-改成_
for (i in seq_along(files)) 
  assign(paste0("A",filesNewname[i]), 
         read.csv(lf[i],check.names = FALSE,
                  blank.lines.skip=TRUE)) #跳过前面空白行

# 合并1 【多数据框合并-合并前需合并为List】
 multimerge<-function(dat=list(),...){
   if(length(dat)<2)return(as.data.frame(dat))
   mergedat<-dat[[1]]
   dat[[1]]<-NULL
   for(i in dat){mergedat<-merge(all=TRUE,mergedat,i,...)}
   return(mergedat)
 }
 
files2=ls(pattern = "_");files2
listALL=list()
 
# 数据框合成List
 for (i in 1:length(ls(pattern = "_"))) {
   eval(parse(text = paste0("listALL","[[",i,"]]", " <-",files2[i])))
 }
# 合并1
dataALL <- multimerge(listALL)


# 检查多个数据框变量名是否都一致
# dataA[i,1:2]=as.vector(table(a%in%names(A2005_2)))
a=names(A2005_1);a
dataA=data.frame()
for (i in seq_along(files2)) {
   eval(parse(text = paste0(
     "dataA[",i,",1:2]=as.vector(table(a%in%names(",files2[i],")))"
   )))
}

rm(list = files2)

# 合并2 【同合并1为核心merge函数】
#想返回所有的值需要开启accumulate参数
dataALL=Reduce(function(x,y) merge(x,y,all=TRUE),
               listALL,accumulate =FALSE)
			   
# 合并3 【bind_rows注意看后面警告内容】
dataALL=dplyr::bind_rows(listALL)  # 

保存为.RData格式

# 保存为.Rdata,环境的数据
save(data1, data2, data3,file = "study1.RData")
#使用save.image()函数保存工作目录下所有的变量
save.image(file = "study1.RData")
# 读取
load("study1.RData")

# 模糊指定保留
a=ls()[match(ls(pattern = "data"),ls())]
save(list = a,file = "study1.RData")

读取的空白行列删除处理

library(janitor)
df <- data.frame(x=c(5,2,NA),y=c(1:2,NA),
                 z=c(3,2,NA),q=c(NA,NA,NA));df
remove_empty(df)
remove_empty(df,which = "rows")
remove_empty(df,which = "cols")
remove_empty(df,which=c('rows','cols'))

等分数据-Reduce-merge

# 10等分 【10的位置可改为100,需要多次循环复制代码】
e=1:length(listALL)
ee=cut(e,breaks=10,labels=F)
e[ee==1];e[ee==1][1];e[ee==1][length(e[ee==1])]
e1=e[ee==1][1]:e[ee==1][length(e[ee==1])];e1
e2=e[ee==2][1]:e[ee==2][length(e[ee==2])];e2
e3=e[ee==3][1]:e[ee==3][length(e[ee==3])];e3

for (i in 1:10) {
    eval(parse(text = paste0(
    "eee",i,"=e[ee==",i,"][1]:e[ee==",i,
    "][length(e[ee==",i,"])];print(eee",i,")")))
}

# 单个准备
# dataALL1=Reduce(function(x,y) merge(x,y,all=TRUE),
#                 listALL[1:4],accumulate =FALSE)
# dataALL2=Reduce(function(x,y) merge(x,y,all=TRUE),
#                 listALL[5:8],accumulate =FALSE)
# dataALL=Reduce(function(x,y) merge(x,y,all=TRUE),
#                 list(dataALL1,dataALL2,dataALL3),
#                accumulate =FALSE)
# 循环合并
for (i in 1:10) {
  eval(parse(text = paste0(
    "datALL",i,"=Reduce(function(x,y) merge(x,y,all=TRUE),",
    "listALL[eee",i,"],accumulate =FALSE)"
  )))
}

# 10个初步合成的数据框合成list
listALL2=list()
files3=ls(pattern = "datALL");files3
for (i in 1:length(ls(pattern = "datALL"))) {
  eval(parse(text = paste0(
    "listALL2","[[",i,"]]", " <-",files3[i])))
}
# 大合并
dataALL=Reduce(function(x,y) merge(x,y,all=TRUE),
               listALL2,
               accumulate =FALSE)
save(dataALL,file = "study1.RData")

急速版

# 读取数据
lf <-list.files(pattern = ".csv$") 
(files <- gsub("", "", lf))
datalist=lapply(files, function(x) read.csv(x,header=T,stringsAsFactors=F))
# 或者
library(purrr)
map(files,read.csv)
# 【上面都是生成list】

# 直接读取生成数据框   # 【一步到位】
DataFrameAll=map_df(files,function(x) read.csv(x,header=T,stringsAsFactors=F))  
# 同list转为data已验证,
# Reduce(function(x,y) merge(x,y,all=TRUE),datalist,accumulate =FALSE)

# 去空白,可以去掉只有列名的列
map_df(datalist, function(x) janitor::remove_empty(x,which=c('rows', 'cols')))

# 变量全部转为字符【只根据报错变量专字符】
datalist[[11]][["联系电话"]] <- as.character(datalist[[11]][["联系电话"]])
datalist[[12]][["联系电话"]] <- as.character(datalist[[12]][["联系电话"]])
str(datalist[[11]][["联系电话"]])

# 合并数据 【3种任选一】
datalist2=do.call(dplyr::bind_rows,datalist)
# 保存
save(datalist2,file = "study2.RData")

笔记/警告

{{< note title=“数据挑选与过滤”>}}

## 按名称/特定变量名去掉列 【数据框】
# 定位向量所在向量的位置,第几列
match("VAR1",names(data))
which("VAR2"==names(data))

a=match(c("VAR1","VAR5","VAR3"),names(data));a
data2=subset(data,select = c(-a))
# list里面数据框的提取为list 【list】
# 【需要定义function,此时Rbase函数大部分不能使用】
a=map(datalist, function(x) select(x,年龄,性别))
b=map(datalist, function(x) filter(x,年龄=="30岁"&性别=="男"))
# 替换为map_df,提取为数据框

{{< /note >}}

{{< note title=“内存计算”>}}

## 查看内存大小MB 多少M
print(object.size(data), units = "auto", standard = "SI")   
print(object.size(data2), units = "auto", standard = "SI")

{{< /note >}}

三个合并函数讨论

{{< warning title=“三个合并函数讨论”>}}

xlist <- list(w=data.frame(a=c(1,2,3),b=c(7,8,9)),
          z=data.frame(b=c(6,8,9),a=c(1,2,3)),
          q=data.frame(a=c(1,2,3),b=c(6,88,9)) );xlist
w=x[[1]];z=x[[2]];q=x[[3]]

bind_rows(w,z,q) # 【数据框-错误】
bind_cols(w,z,q) # 【数据框-错误】
do.call(bind_rows,xlist) #【List-错误】

merge(w,z,all = T) #【数据框-正确】
full_join(w,z) #【数据框-正确】
# list-三个数据框合并 【List-正确】
Reduce(function(x,y) merge(x,y,all=TRUE),xlist,
       accumulate =F)
Reduce(function(x,y) full_join(x,y),
               xlist,accumulate =FALSE)

{{< /warning >}}

{{< warning title=“dplyr::bind_rows()” >}}
bind_rows(list(data1,data2)) 也会像merge一样智能合并?

如果数据一个变量存在相同的多行,就有多少行

合并一定要先降重复 确保大数据一定不会有重复-其实少数重复无大影响

不同数据变量名可以顺序不一样
{{< /warning >}}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值