简单读取与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 >}}