2011-10-19 13 views
8

es posible hacer lo siguiente:formato condicional: hacer que las células de colores

loc1 <- c("Aa", "Aa", "aa", "Aa") 
loc2 <- c("aa", "aa", "aa", "AA") 
loc3 <- c("aa", "Aa", "aa", "aa") 
gen <- data.frame(loc1, loc2, loc3) 

loc1g <- c(0.01, 0.5, 1, 0.75) 
loc2g <- c(0.2, 0.1, 0.2, 0.6) 
loc3g <- c(0.8, 0.8, 0.55, 1) 
pval <- data.frame(loc1g, loc2g, loc3g) 

Quiero imprimir a un archivo de generación de trama de datos tal manera que se forma condicional formateado por la trama de datos pval. Significa que (fila1, col1) del color gen depende de pvale (fila1, col1). Los siguientes son los códigos de colores:

0 to 0.3 is "red" text color 
0.31 to 0.7 is "yellow" 
> 0.7 is "red" 

Gen [1,1] será "Aa" impreso en el color del texto rojo y así sucesivamente ....

apreciado su ayuda.

EDITS:

estoy más interesado en la impresión de no trazado en el gráfico. Si puedo guardar la salida como MS Excel y abrir en MSEXCEL, sería genial. También puedo incluir otros tipos de formato de editores de texto que pueden leer texto codificado por colores. Como mi matriz de datos originales debe tener una dimensión de 1000 x 1000 o incluso más. Me gustaría conocer rápidamente el valor de p que se desprende de cada categoría gen.

+2

¿Qué tipo de archivo tenía en mente? Uno podría hacer esto como un gráfico, un archivo de látex o Excel, por nombrar solo algunas opciones. – Andrie

+0

Y también para aclarar, no puede hacer esto en texto sin formato, como la salida en una sesión R interactiva. El texto sin formato no tiene colores ... – Harlan

+0

Puede generar la tabla en algún tipo de lenguaje de marcado (consulte, por ejemplo, el paquete 'ascii'), pero prepárese: la consola R/GUI/IDE básica no podrá analizar/colorear eso. HTML/LaTeX/xls podría ser otra opción. – daroczig

Respuesta

4

dar una respuesta POC-como que está utilizando un bucle feo y no el diseño más hermoso:

Cargando p.ej. el paquete xlxs para poder escribir en Excel 2007 Formato: (consulte el manual)

library(xlsx) 

Vamos a crear un libro y una hoja:

wb <- createWorkbook() 
sheet <- createSheet(wb, "demo") 

definir algunos estilos para usar en la hoja de cálculo :

red <- createCellStyle(wb, fillBackgroundColor="tomato", fillForegroundColor="yellow", fillPattern="BIG_SPOTS") 
yellow <- createCellStyle(wb, fillBackgroundColor="yellow", fillForegroundColor="tomato", fillPattern="BRICKS1") 

y lo feo de bucle que está pegando cada célula de la hoja de cálculo con el formato adecuado:

for (i in 1:nrow(pval)) { 
    rows <- createRow(sheet, rowIndex=i) 
    for (j in 1:ncol(pval)) { 
     cell.1 <- createCell(rows, colIndex=j)[[1,1]] 
     setCellValue(cell.1, gen[i,j]) 
     if ((pval[i,j] < 0.3) | (pval[i,j] > 0.7)) { 
      setCellStyle(cell.1, red) 
     } else { 
      setCellStyle(cell.1, yellow) 
     } 
    } 
} 

guardar el archivo de Excel:

saveWorkbook(wb, '/tmp/demo.xls') 

Resultado: demo.xls


solución alternativa con el paquete ascii:

ascii.data.frame() puede exportar tramas de datos a un montón de formatos con la capacidad de agregar algún formato. P.ej.exportar a Pandoc, definir primero los estilos de cada uno células a una matriz con las mismas dimensiones que pval:

style <- matrix('d', dim(pval)[1], dim(pval)[2]) 
style[pval < 0.3 | pval > 0.7] <- 's' 

Ajuste la salida deseada:

options(asciiType = "pandoc") 

y exportar el marco de datos:

> ascii(gen, style=cbind('h', style)) 

    **loc1** **loc2** **loc3** 
--- ---------- ---------- ---------- 
1 Aa   **aa**  **aa**  
2 **Aa**  **aa**  Aa   
3 **aa**  aa   **aa**  
4 **Aa**  **AA**  **aa**  
--- ---------- ---------- ---------- 

Con ascii::Report puede convertirlo fácilmente en pdf, odt o html. Hay que probarlo :) pequeña demo con HTML de salida: result

r <- Report$new() 
r$add(section("Demo")) 
r$add(ascii(gen, style=cbind('h', style))) 
options(asciiType = "pandoc") 
r$backend <- "pandoc" 
r$format <- "html" 
r$create() 

Y ODT de salida: result

r$format <- "odt" 
r$create() 
+0

+1 para el ejemplo 'ascii' y' pandoc'. – Andrie

5

Parece que quiere imitar a Excel. Aquí hay un par de ejemplos:

x = 1:ncol(pval) 
y = 1:nrow(pval) 

# Colored backgrounds 
dev.new(width=4, height=4) 
image(x, y, t(as.matrix(pval)), 
    col = c('red', 'yellow', 'red'), 
    breaks = c(0, 0.3, 0.7, 1), 
    xaxt='n', 
    yaxt='n', 
    ylim=c(max(y)+0.5, min(y)-0.5), 
    xlab='', 
    ylab='') 
centers = expand.grid(y, x) 
text(centers[,2], centers[,1], unlist(gen)) 

enter image description here

# Colored text 
dev.new(width=4, height=4) 
image(x,y, matrix(0, length(x), length(y)), 
    col='white', 
    xaxt='n', 
    yaxt='n', 
    ylim=c(max(y)+0.5, min(y)-0.5), 
    xlab='', 
    ylab='') 
pvals = unlist(pval) 
cols = rep('red', length(pvals)) 
cols[pvals>0.3 & pvals<=0.7] = 'yellow' 
text(centers[,2], centers[,1], unlist(gen), col=cols) 
grid(length(x),length(y)) 

enter image description here

+0

gracias, parece interesante hacerlo .... puede ser una solución parcial si quiero ver en parte. Por favor, mira mis ediciones recientes para hacer una pregunta, estoy interesado en más impresión basada en texto en lugar de gráficos ... mi imaginación era hacer algo que podamos hacer en excel, aunque creo que el formato de excelencia en Excel no depende de la propia celda otra matriz. – jon

2

Si realmente quiere hacer esto (ver @ comentario de Joris para una mejor manera), recomendaría encarecidamente abandonar Excel y probarlo en LaTeX. Utilice el paquete R xtable combinado con el LaTeX package \colortbl.

Ventajas:

  • Bastante impresión
  • Molestias Sin Excel (exportar a Excel es fácil, exportar a Excel, manteniendo el formato es mucho más difícil, y una receta de errores)

Desventajas :

  • No es Excel
  • Probablemente tome algún trabajo hacer que los colores funcionen con xtable. Sin embargo, solo tiene que hacer esto una vez y luego funcionará para siempre; incluso puede liberar su función en un paquete o enviarla a los mantenedores de xtable para su inclusión en el paquete y salvar el problema a todos los demás.
Cuestiones relacionadas