条件格式化:使细胞变得丰富多彩
有可能做到以下几点:
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维护者,以便将其包含在他们的包中,并为其他人节省麻烦。