2

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

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

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

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

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

任何帮助表示赞赏。

4

3 回答 3

5

do.call是所需的成语。

例如

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

现在,vioplot需要命名一个参数x(其余的传入...))

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


 do.call('vioplot', nd)
于 2013-07-17T00:04:15.760 回答
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()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")
于 2013-07-17T00:04:26.387 回答
2

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

#  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="" ) , ")" ) ) )
于 2013-07-16T23:02:07.547 回答