2011-10-19 11 views
8

możliwe jest wykonanie następujących czynności:formatowanie warunkowe: making komórki kolorowe

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) 

Chcę drukować do pliku na gen dataframe taki sposób, że jest warunkowo sformatowany przez PVAL dataframe. Środek niż (rząd1, col1) koloru genów zależy od pvale (wiersz1, kol1). Poniżej przedstawiono kodowanie koloru:

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

gen [1,1] będzie "AA" wydrukowane w kolorze czerwonym tekstem i tak dalej ....

doceniona za pomoc.

redaguje:

jestem bardziej zainteresowany nie drukuje kreślenia na wykresie. Jeśli mogę zapisać wyniki jako MS Excel i otworzyć w MSEXCEL byłoby wspaniale. Mogę też być innego rodzaju formatem edytorów tekstu, który może czytać tekst oznaczony kolorem. Moja oryginalna matryca danych powinna mieć rozmiar 1000 x 1000 lub nawet więcej. Chciałbym szybko poznać niezmienną wartość p dla każdej kategorii genów.

+2

Jakiego rodzaju plików miałeś na myśli? Można to zrobić jako grafikę, plik lateksu lub Excel, aby wymienić tylko kilka opcji. – Andrie

+0

A także, aby wyjaśnić, nie można tego zrobić w postaci zwykłego tekstu, takiego jak dane wyjściowe w interaktywnej sesji R. Zwykły tekst nie ma kolorów ... – Harlan

+0

Możesz wygenerować tabelę w jakimś języku markdown (patrz np. Pakiet 'ascii'), ale bądź przygotowany: podstawowa konsola/GUI/IDE nie będzie w stanie przeanalizować/pokoloruj to. HTML/LaTeX/xls może być inną opcją. – daroczig

Odpowiedz

4

Nadanie odpowiedź POC-podobne, które korzysta z brzydkiego pętlę, a nie najpiękniejszych wzorem:

Loading na przykład. pakiet xlxs, aby móc napisać do programu Excel w formacie 2007: (! zobacz instrukcję)

library(xlsx) 

Stwórzmy skoroszytu i arkusza:

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

zdefiniować kilka stylów do wykorzystania w arkuszu kalkulacyjnym :

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

i brzydki pętla, która jest wklejenie każdą komórkę w arkuszu kalkulacyjnym z odpowiednim formacie:

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

Zapisywanie pliku Excel:

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

Wynik: demo.xls


Alternatywne rozwiązanie z pakietu ascii:

ascii.data.frame() może eksportować ramek danych do kilka formatów z możliwością dodania trochę formatowania. Na przykład.eksporcie do pandoc najpierw określić style każdej komórki do macierzy o tych samych wymiarach jak pval:

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

Ustawić wyjściowych:

options(asciiType = "pandoc") 

i wysyłania ramki danych:

> 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**  
--- ---------- ---------- ---------- 

Dzięki ascii::Report możesz z łatwością przekonwertować go na format pdf, odt lub html. Po prostu spróbować :) Mały demo z HTML wyjściowe: 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() 

I odt wyjściowa: result

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

+1 dla przykładu "ascii" i "pandoc". – Andrie

5

Wygląda na to, że chcesz naśladować program Excel. Oto kilka przykładów:

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

dziękuję, wydaje się interesujące to zrobić .... może być częściowe rozwiązanie, jeśli chcę zobaczyć w części. Proszę zobaczyć moje ostatnie edycje do zakwestionowania, interesuje mnie bardziej tekstowy wydruk wyjściowy raczej w grafice ... moja wyobraźnia miała zrobić coś, co możemy zrobić w programie Excel, choć uważam, że Excel zapewnia formatowanie wartości na samej komórce, nie z inna matryca. – jon

2

Jeśli naprawdę chcesz to zrobić (patrz @ komentarzu Joris za lepszy sposób), zdecydowanie polecam rezygnację z Excela i wypróbowanie go w LaTeX. Użyj pakietu R xtable w połączeniu z LaTeX package \colortbl.

Zalety:

  • Dość drukowania
  • kłopotów Nie Excel (eksport do programu Excel jest łatwe; eksportowania do programu Excel przy zachowaniu formatowania jest znacznie trudniejsze, a przepis na błędy)

Wady :

  • To nie jest Excel
  • Najprawdopodobniej będzie trochę pracy, aby kolory działały z xtable. Jednak musisz to zrobić tylko raz, a potem będzie działać wiecznie - możesz nawet zwolnić swoją funkcję w pakiecie lub przesłać ją do opiekunów xtable w celu umieszczenia w pakiecie i uratować wszystkich innych kłopotów.
Powiązane problemy