我正在尝试绘制一个包含许多列的小提琴情节。我将在这样的文件中阅读:
data <- read.table("file.txt", as.is=TRUE);
数据文件将包含许多行,每行都应该是一列。问题是我事先不知道数据文件将包含多少行。从我通过研究发现的,我可以制作一个像这样的小提琴情节:
vioplot(x, y, z, ....);
这会给我一个预设数量的列。我将如何处理所有行?另外,我有一个与列对应的字符串列表,因此命名参数也需要类似的方法。
感谢任何帮助。
答案 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)
如何使用parse
和eval
动态构建和评估表达式(可能不是一个好方法,但我认为它符合您的需求)....
# 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="" ) , ")" ) ) )