我有一个代码,用于合并Excel表中的数据。该代码获取表中的每一列,并将其与另一个表中的同一列合并。表格相同,数据每月更改一次。这将为每一列创建一个时间序列。
代码如下(我使用的数据可以找到here。我的目标是为提供者电子表格中的“提供者按测试”标签为追溯至4月16日的每一列创建一个时间序列):
library(readxl)
library(openxlsx)
library(data.table)
files <- choose.files()
mylist <- list()
mylist2 <- list()
mergedlist <- list()
columns <- c(5, 6, 7)
dumName <- NULL
oldRows<-0
newRows<-0
for(i in 1:length(files)){
dumName<-paste0("name ",i)
dummy<-as.data.frame(read_excel(files[i],sheet="Provider by Test",range="D15:AC3150",na=c("NULL","NA", "#N/A",'-','')))
dummy<-dummy[rowSums(is.na(dummy))!=ncol(dummy),]
vecX<-c()
vecR<-c(1:11)
for(z in 1:nrow(dummy)){#identifying unneeded rows
if(any(vecR==as.numeric(dummy[z,3]))){
vecX<-append(vecX,z)
}
}
dummy<-dummy[-vecX,]
dummy$id<-paste0(dummy[,1],",",dummy[,3])
if(i==1){
oldRows<-nrow(dummy)
for(j in 1:length(columns)){
mylist[[j]]<-data.table(dummy[,c(columns[j],27)])
}
}else{
newRows<-nrow(dummy)
for(j in 1:length(columns)){
mylist2[[j]]<-data.table(dummy[,c(columns[j],27)])
colnames(mylist2[[j]])[1]<-dumName
if(oldRows>newRows){
mergedlist[[j]]<-merge(x=mylist[[j]],y=mylist2[[j]],by="id",all.x=TRUE)
}else if(oldRows<newRows){
mergedlist[[j]]<-merge(x=mylist[[j]],y=mylist2[[j]],by="id",all.y=TRUE)
}else if(oldRows==newRows){
mergedlist[[j]]<-merge(x=mylist[[j]],y=mylist2[[j]],by="id",all=TRUE)
}
mylist[[j]]<-mergedlist[[j]]
newRows<-oldRows
}
}
}
wb <- loadWorkbook(choose.files())
writeData(wb, sheet=5, mergedlist[[1]])
writeData(wb, sheet=6, mergedlist[[2]])
writeData(wb, sheet=7, mergedlist[[3]])
saveWorkbook(wb, choose.files(), overwrite=TRUE)
我注意到mergedlist
的第一个元素总是缺少一些数据行。经过一番摸索之后,我注意到合并数据时使用的“ if”语句存在问题。
我希望这段代码对具有所有数据的mergedlist
列表的第一个元素执行已经完成的工作。
我对在数据表上使用merge()
函数不是很熟悉,所以这可能是编码不良的问题。