Применение нескольких форматов к столбцам в data.frame в R - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть набор данных в 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)))

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...