una trabajar paquete matriz leer importar datos con como r formatting xlsx

trabajar - paquete xlsx r



exportar marcos de datos a Excel a través de xlsx con formato condicional (2)

Quiero exportar marcos de datos a Excel y resaltar celdas de acuerdo con ciertas reglas. No creo que esta respuesta a una pregunta similar sea correcta. Creo que es posible, y creo que me CellStyle usando las funciones CellStyle del paquete xlsx .

A continuación, describo lo que he intentado. La mayoría de las ideas provienen de los archivos de ayuda del paquete. Llego hasta el final y obtengo un error cuando trato de aplicar el estilo que creé a las celdas que cumplen con los criterios. Error in .jcall(cell, "V", "setCellStyle", cellStyle$ref) : RcallMethod: invalid object parameter el error: Error in .jcall(cell, "V", "setCellStyle", cellStyle$ref) : RcallMethod: invalid object parameter .

library(xlsx) # create data cols <- sample(c(1:5), 1) # number of columns to vary to mimic this unknown label <- rep(paste0("label ", seq(from=1, to=10))) mydata <- data.frame(label) for (i in 1:cols) { mydata[,i+1] <- sample(c(1:10), 10) } # exporting data.frame to excel is easy with xlsx package sheetname <- "mysheet" write.xlsx(mydata, "mydata.xlsx", sheetName=sheetname) file <- "mydata.xlsx" # but we want to highlight cells if value greater than or equal to 5 wb <- loadWorkbook(file) # load workbook fo <- Fill(backgroundColor="yellow") # create fill object cs <- CellStyle(wb, fill=fo) # create cell style sheets <- getSheets(wb) # get all sheets sheet <- sheets[[sheetname]] # get specific sheet rows <- getRows(sheet) # get rows cells <- getCells(rows) # get cells values <- lapply(cells, getCellValue) # extract the values # find cells meeting conditional criteria highlight <- "test" for (i in names(values)) { x <- as.numeric(values[i]) if (x>=5 & !is.na(x)) { highlight <- c(highlight, i) } } highlight <- highlight[-1] # apply style to cells that meet criteria if (length(highlight)>0) { # proceed if any cells meet criteria setCellStyle(cells[highlight], cs) # DOES NOT WORK } # save saveWorkbook(wb, file)

Actualización: también he intentado:

if (length(highlight)>0) { # proceed if any cells meet criteria for (h in 1:length(highlight)) { setCellStyle(cells[highlight[h]], cs) # DOES NOT WORK } }

Pero obtengo el error: Error in .jcall(cell, "V", "setCellStyle", cellStyle$ref) : RcallMethod: cannot determine object class


Ha pasado un tiempo desde que usé esta función. Sí, debería ser posible guardar el formato condicional. Mi (viejo) código se da a continuación. Espero que te ayude

file.name <- paste(''loadings.'',state$data,''.xls'', sep = "") wb <- loadWorkbook(file.name, create = TRUE) createSheet(wb, name = ''loadings'') clearSheet(wb, sheet = ''loadings'') Variables <- rownames(df) df.loadings <- cbind(Variables,df) df.loadings[,''Communality''] <- NULL writeWorksheet(wb,df.loadings[,-1], sheet = ''loadings'', rownames = ''Variables'', startRow = 1, startCol = 1) max.loading <- createCellStyle(wb) setFillPattern(max.loading, fill = XLC$"FILL.SOLID_FOREGROUND") setFillForegroundColor(max.loading, color = XLC$"COLOR.SKY_BLUE") maxVal <- apply(abs(df.loadings[,-1]),1,max) maxValIndex <- which(abs(df.loadings[,-1]) == maxVal, arr.ind = TRUE) setCellStyle(wb, sheet = "loadings", row = maxValIndex[,''row'']+1, col = maxValIndex[,''col'']+1, cellstyle = max.loading) df.corr <- data.frame(cor(f.data)) df.corr <- cbind(Variables,df.corr) createSheet(wb, name = ''correlations'') clearSheet(wb, sheet = ''correlations'') writeWorksheet(wb, df.corr, sheet = ''correlations'', startRow = 1, startCol = 1) corr <- createCellStyle(wb) setFillPattern(corr, fill = XLC$"FILL.SOLID_FOREGROUND") setFillForegroundColor(corr, color = XLC$"COLOR.SKY_BLUE") corrIndex <- which(abs(df.corr[,-1]) > .3 & df.corr[,-1] != 1 , arr.ind = TRUE) setCellStyle(wb, sheet = "correlations", row = corrIndex[,''row'']+1, col = corrIndex[,''col'']+1, cellstyle = corr) saveWorkbook(wb) if(.Platform$OS.type == "unix") { execute(paste("browseURL(/"",getwd(),''/'',file.name,"/", browser = ''/usr/bin/open'')",sep='''')) } else { execute(paste("browseURL(/"",getwd(),''/'',file.name,"/", browser = NULL)",sep='''')) }


Probar esto. Cambié algunas cosas, incluyendo un ligero cambio en la llamada a Fill y la limitación de las celdas incluidas para consideración de las personas con datos numéricos. lapply para aplicar el formato condicional.

cols <- sample(c(1:5), 1) # number of columns to vary to mimic this unknown label <- rep(paste0("label ", seq(from=1, to=10))) mydata <- data.frame(label) for (i in 1:cols) { mydata[,i+1] <- sample(c(1:10), 10) } # exporting data.frame to excel is easy with xlsx package sheetname <- "mysheet" write.xlsx(mydata, "mydata.xlsx", sheetName=sheetname) file <- "mydata.xlsx" # but we want to highlight cells if value greater than or equal to 5 wb <- loadWorkbook(file) # load workbook fo <- Fill(foregroundColor="yellow") # create fill object cs <- CellStyle(wb, fill=fo) # create cell style sheets <- getSheets(wb) # get all sheets sheet <- sheets[[sheetname]] # get specific sheet rows <- getRows(sheet, rowIndex=2:(nrow(mydata)+1) # get rows # 1st row is headers cells <- getCells(rows, colIndex = 3:(cols+3)) # get cells # in the wb I import with loadWorkbook, numeric data starts in column 3 # and the first two columns are row number and label number values <- lapply(cells, getCellValue) # extract the values # find cells meeting conditional criteria highlight <- "test" for (i in names(values)) { x <- as.numeric(values[i]) if (x>=5 & !is.na(x)) { highlight <- c(highlight, i) } } highlight <- highlight[-1] lapply(names(cells[highlight]), function(ii)setCellStyle(cells[[ii]],cs)) saveWorkbook(wb, file)