2011-10-19 12 views
8

è possibile effettuare le seguenti operazioni:Formattazione condizionale: rendendo le cellule colorate

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) 

voglio stampare su un file di generazione dataframe modo tale che è condizionatamente formattato dal dataframe pval. I mezzi di (riga1, colonna1) di colore gen dipendono da pvale (riga1, colonna1). Di seguito sono codifica a colori:

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

gen [1,1] sarà "Aa" stampato a colori testo rosso e così via ....

apprezzato il vostro aiuto.

Modifiche:

io sono più interessato a stampa non tracciare sul grafico. Se riesco a salvare l'output come MS excel e aperto in MSEXCEL, sarebbe fantastico. Posso anche essere altri tipi di formati di editor di testo in grado di leggere testo con codice colore. Poiché la mia matrice dati originale dovrebbe essere di una dimensione di 1000 x 1000 o anche di più. Mi piacerebbe conoscere rapidamente un valore p non rispettoso per ogni categoria di gen.

+2

Che tipo di file avevi in ​​mente? Uno potrebbe fare questo come un grafico, un file in lattice o Excel, per citarne solo alcune opzioni. – Andrie

+0

E anche per chiarire, non è possibile farlo in testo semplice, ad esempio l'output in una sessione R interattiva. Il testo normale non ha colori ... – Harlan

+0

Puoi generare la tabella in una sorta di linguaggio di markdown (vedi ad esempio il pacchetto 'ascii'), ma preparati: la console R di base/GUI/IDE non sarà in grado di analizzare/coloratelo. HTML/LaTeX/xls potrebbe essere un'altra opzione. – daroczig

risposta

4

Dare una risposta POC-like, che utilizza un brutto ciclo e non il disegno più bello:

Caricamento in corso per esempio. il pacchetto xlxs per essere in grado di scrivere in formato Excel 2007: (! vedere il manuale)

library(xlsx) 

creiamo una cartella di lavoro e un foglio:

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

definire alcuni stili da utilizzare nel foglio di calcolo :

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

E il brutto ciclo che è incollare ogni cella al foglio di calcolo con il formato appropriato:

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) 
     } 
    } 
} 

Salvare il file di Excel:

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

Risultato: demo.xls


soluzione alternativa con il pacchetto ascii:

ascii.data.frame() possibile esportare i frame di dati a un gruppo di formati con la possibilità di aggiungere qualche formattazione. Per esempio.esportazione Pandoc, innanzitutto definire gli stili di ogni cellule a un array con le stesse dimensioni pval:

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

Impostare l'uscita desiderata:

options(asciiType = "pandoc") 

E esportare il frame di dati:

> 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 potresti facilmente convertirlo in pdf, odt o html. Provare per credere :) Piccolo demo con HTML uscita: 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() 

E ODT uscita: result

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

+1 per l'esempio 'ascii' e' pandoc'. – Andrie

5

Suoni come se si desidera imitare Excel. Qui ci sono un paio di esempi:

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

grazie, sembra interessante farlo .... può essere una soluzione parziale se voglio vedere in parte. Per favore, guarda le mie ultime modifiche alla domanda, mi interessa più stampa di output basata su testo piuttosto che grafica ... la mia immaginazione era di fare qualcosa che possiamo fare in Excel, anche se credo che Excel fornisca la formattazione del valore sulla cella stessa non da altra matrice. – jon

2

Se davvero vuole fare questo (vedi @ commento di Joris per un modo migliore), consiglio vivamente di eliminare Excel e provarlo in LaTeX. Utilizzare il pacchetto R xtable combinato con LaTeX package \colortbl.

Vantaggi:

  • Abbastanza stampa
  • fastidi No Excel (l'esportazione in Excel è facile, l'esportazione in Excel, pur mantenendo la formattazione è molto più difficile, e una ricetta per gli errori)

Svantaggi :

  • Non è Excel
  • Probabilmente ci vorrà del lavoro per far funzionare i colori con xtable. Tuttavia, devi farlo una sola volta e poi funzionerà per sempre - puoi anche rilasciare la tua funzione in un pacchetto o inviarla ai manutentori xtable per l'inclusione nel loro pacchetto e salvare tutti gli altri il problema.
Problemi correlati