У меня есть набор данных в Excel, который я импортирую в R как фрейм данных.После некоторых операций с ним я импортирую новую версию того же фрейма данных обратно в Excel.Теперь в некоторых столбцах есть различные значения символов.Это заставляет весь столбец возвращать символьные значения (включая числовые значения, которые я хотел бы сохранить в числовом формате).
Я хотел бы сохранить числовые значения в числовом формате и символьные значения в символьном формате.Для этого я написал пару for
циклов, которые существенно убирают все символьные значения из фрейма данных, и после того, как столбцы были преобразованы в числовой формат с помощью аргумента col_types
в функции read_excel
(которая заменяет символьные значения на NA), иВернувшись в Excel, R записывает все значения символов в Excel через writeData
.Код ниже:
library(readxl) #To read files
library(openxlsx) # To save data
rev<-as.data.frame(read_excel(choose.files(),sheet="Data",range="A7:FA400"))
t<-list() #list to contain row positions for each character value
colA<-c() #vector to contain col positions for each character value
for(i in 1:ncol(rev)){
dummy<-try(any(rev[,i]=="DNR"),silent=T)
if(inherits(dummy,"try-error")){# In case there is an error, I am skipping that column and go to the next one
print(paste0("col ",i,": There was an error"))# Letting me know where error was
}else{
vecA<-which(rev[,i]=="DNR")#checking where chr values are
t<-append(t,list(vecA))#Noting row positions
colA<-append(colA,i)#Noting col positions
}
}
vec2<-c()
for(i in 1:length(t)){# In case NA is returned, I would like to exclude them from my list of rows and my vector of columns
if(!length(t[[i]])>0){
vec2<-append(vec2,i)
}
}
t<-t[-vec2]
colA<-colA[-vec2]
rev2<-as.data.frame(read_excel(choose.files(),sheet="Incomp18wksProv",range="A7:FA400",na=c("NULL","NA", "#N/A",'-',''),col_types=c("text",rep("numeric",ncol(rev)-1))))
rev2<-rev2[rowSums(is.na(rev2))!=ncol(rev2),]
x<-"DNR" #Name of a chr value
wb<-loadWorkbook(choose.files())
for(i in 1:length(colA)){# Creating cell position to put chr values in
for(j in 1:length(t[[i]])){
x<-"DNR"
writeData(wb,sheet="Sheet2",x,startCol = colA[i],startRow = t[[i]][j]+1)
}
}
writeData(wb,sheet="Sheet1",rev)
saveWorkbook(wb,choose.files(),overwrite=TRUE)# Saving file
Требуется довольно много времени для запуска, поэтому я хотел бы знать, есть ли лучший способ выполнить ту же задачу.
Пустой кадр данных: data.frame(c(rep("Name",50)),c(rep(NA,50)),c(rep(1,45),"DNR","DNR",1,1,1),c("DNR","DNR",rep(1,48)))
Спасибо!