条件格式化:使单元格丰富多彩

时间:2011-10-19 21:15:14

标签: excel r formatting

是否可以执行以下操作:

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)

我想打印到gen数据帧的文件,这是由pval数据帧有条件地格式化的。比颜色(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”等等....

感谢您的帮助。

编辑:

我更感兴趣的是打印而不是绘图。如果我可以将输出保存为MS excel并在MSEXCEL中打开它会很棒。我也可以是其他类型的文本编辑器格式,可以读取彩色编码文本。由于我的原始数据矩阵的尺寸应为1000 x 1000甚至更大。我想快速了解每个gen类别的p值。

3 个答案:

答案 0 :(得分:5)

听起来你想模仿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))

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

答案 1 :(得分:4)

给出一个类似POC的答案,它使用的是一个丑陋的循环而不是最美丽的设计:

加载例如。 xlxs包能够写入Excel 2007格式:

library(xlsx)

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

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的替代解决方案:

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

导出数据框:

> 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 输出的小型演示: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()

odt 输出:result

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

答案 2 :(得分:2)

如果你真的想要这样做(请参阅@ Joris的评论以获得更好的方法),我强烈建议放弃Excel并在LaTeX中尝试。将R包xtableLaTeX package \colortbl结合使用。

优点:

  • 漂亮印刷
  • 没有Excel麻烦(导出到Excel很容易;导出到Excel同时保持格式化要困难得多,以及错误的处方)

缺点:

  • 这不是Excel
  • 使用xtable颜色可能需要一些工作。但是,您只需要执行一次,然后它将永远工作 - 您甚至可以在包中发布您的功能或将其提交给xtable维护者以包含在他们的包中并为其他人解决问题。