是否可以执行以下操作:
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值。
答案 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))
# 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))
答案 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包xtable
与LaTeX package \colortbl
结合使用。
优点:
缺点:
xtable
颜色可能需要一些工作。但是,您只需要执行一次,然后它将永远工作 - 您甚至可以在包中发布您的功能或将其提交给xtable维护者以包含在他们的包中并为其他人解决问题。