我正在尝试绘制一个包含许多列的小提琴图。我将阅读这样的文件:
data <- read.table("file.txt", as.is=TRUE);
数据文件将有很多行,每行都应该是一列。问题是我事先不知道数据文件将有多少行。根据我通过研究发现,我可以制作这样的小提琴情节:
vioplot(x, y, z, ....);
这会给我一个预设数量的列。我将如何处理所有行?另外,我有一个与列对应的字符串列表,因此命名参数也需要类似的方法。
任何帮助表示赞赏。
do.call
是所需的成语。
例如
nd <- data.frame(t(data))
现在,vioplot
需要命名一个参数x
(其余的传入...
))
# have the first column called `x`
names(nd)[1] <- 'x'
do.call('vioplot', nd)
set.seed(101)
write.table(matrix(runif(1000),nrow=10),file="tmpfile.txt")
##
基本上,您想转置数据并将它们转换为列列表......
dat <- read.table("tmpfile.txt", as.is=TRUE)
cdat <- as.list(as.data.frame(t(as.matrix(dat))))
names(cdat)[1] <- "x" ## vioplot() needs the first element to be called 'x'
library(vioplot)
然后使用do.call
do.call(vioplot,cdat)
如果您有要使用的名称向量:
do.call(vioplot,c(cdat,list(names=nameVector)))
(其他参数将与 一起添加到附加参数列表中names
)
从长远来看,我建议(1)如果可能的话,按列而不是按行存储数据;(2) 熟悉geom_violin()
in ggplot2
- 它更加灵活。
library(reshape2)
mdat <- melt(t(as.matrix(dat))) ## convert to long format
现在,数据存储为 100 行 x 3 列数据框,Var1
其中包含变量(表示来自原始数据集的列)和Var2
(来自原始数据集的行,对应于变量之一)。
library(ggplot2)
ggplot(mdat,aes(x=factor(Var2),y=value))+geom_violin()+
labs(x="variable")
如何使用parse
andeval
动态构建和评估表达式(可能不是一个好方法,但我认为它会满足您的需求)......
# Turn rows into columns
nd <- t(data)
# Explicitly give some names to your columns
colnames(nd) <- paste0( "V",1:ncol(nd) )
# Make some violin plots
require(vioplot)
eval( parse( text = paste0( "vioplot(" , paste0( paste0( "nd[,\"" , colnames(nd) , "\"]" ) , collapse="," , sep="" ) , ")" ) ) )