条件格式化:使细胞变得丰富多彩

有可能做到以下几点:

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) 

我想打印到一个文件来创builddataframe,这种方式是有条件格式化的pval数据框。 比gen颜色(row1,col1)的含义取决于pvale(row1,col1)。 以下是颜色编码:

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

gen [1,1]将被打印成红色文字颜色的“Aa”等。

感谢您的帮助。

EDITS:

我更感兴趣的是不打印graphics的打印。 如果我可以将输出保存为MS excel,并在MSEXCEL中打开,那就太好了。 我也可以是其他types的可以阅读彩色编码文本的文本编辑器格式。 由于我的原始数据matrix的维数应该是1000 x 1000或甚至更多。 我想快速知道每个gen类别的p值。

给出一个使用丑陋的循环,而不是最漂亮的devisePOC类似的答案:

正在加载 xlxs包能够写入Excel 2007格式:

 library(xlsx) 

让我们创build一个工作簿和一张表(参见手册!):

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

定义在电子表格中使用的一些样式:

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

还有一个丑陋的循环,它将每个单元格以适当的格式粘贴到电子表格中:

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

保存Excel文件:

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

结果: demo.xls


软件包ascii替代解决scheme:

ascii.data.frame()可以将数据框导出为一堆格式,并可以添加一些格式。 例如,导出到pandoc ,首先将每个单元格的样式定义为与pval具有相同尺寸的数组:

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

设置所需的输出:

 options(asciiType = "pandoc") 

并输出dataframe:

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

随着ascii::Report你可以很容易地将其转换成pdf,odt或html。 试试吧:)用HTML输出的小演示: 结果

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

odt输出: 结果

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

听起来像你想模仿Excel。 这里有几个例子:

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

在这里输入图像说明

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

在这里输入图像说明

如果你真的想这样做(请参阅@ Joris的更好的评论),我强烈build议在Excel中放弃Excel并尝试它。 将R软件包xtable与LaTeX软件包\colortbl结合使用。

优点:

  • 漂亮的打印
  • 没有Excel的麻烦(导出到Excel是容易的;出口到Excel,同时保持格式化是困难的,是一个错误的秘诀)

缺点:

  • 这不是Excel
  • 这可能需要一些工作,使颜色与xtable工作。 然而,你只需要做一次,然后就可以永久工作 – 甚至可以将你的函数释放到一个包中,或者把它提交给xtable维护者,以便将其包含在他们的包中,并为其他人节省麻烦。