R - 有许多列的小提琴情节

时间:2013-07-16 22:46:05

标签: r math graph plot

我正在尝试绘制一个包含许多列的小提琴情节。我将在这样的文件中阅读:

data <- read.table("file.txt", as.is=TRUE);

数据文件将包含许多行,每行都应该是一列。问题是我事先不知道数据文件将包含多少行。从我通过研究发现的,我可以制作一个像这样的小提琴情节:

vioplot(x, y, z, ....);

这会给我一个预设数量的列。我将如何处理所有行?另外,我有一个与列对应的字符串列表,因此命名参数也需要类似的方法。

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

do.call是所需的成语。

例如

nd <- data.frame(t(data))

现在,vioplot需要一个名为x的参数(其余部分在...中传递))

# have the first column called `x`
names(nd)[1] <- 'x'


 do.call('vioplot', nd)

答案 1 :(得分:5)

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()中的ggplot2 - 它更加灵活。

library(reshape2)
mdat <- melt(t(as.matrix(dat)))  ## convert to long format

现在,数据存储为100行3列数据框,变量为Var1 (表示原始数据集中的列)和Var2(行 来自原始数据集,对应于其中一个变量。)

library(ggplot2)
ggplot(mdat,aes(x=factor(Var2),y=value))+geom_violin()+
   labs(x="variable")

答案 2 :(得分:2)

如何使用parseeval动态构建和评估表达式(可能不是一个好方法,但我认为它符合您的需求)....

#  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="" ) , ")" ) ) )