2013-07-18 72 views
4

我正在寻找一种方式来绘制与许多小提琴(列)的小提琴情节。问题是我的列都长短不一。例如,它是这样的:R - 小提琴情节与不同列

"V1" "V2" 
"V1" 9 255.5 
"V2" 432 286 
"V3" 161 322.5 
"V4" 320.5 277 
"V5" 253.5 153.5 
"V6" 301 155.5 
"V7" 113 218.5 
"V8" 341 394 
"V9" 138 93.5 
........ 
"V38166" 62 152 
"V38167" NA 20.5 
"V38168" NA 12 
"V38169" NA 40.5 
"V38170" NA 88 
"V38171" NA 2.5 
"V38172" NA 279.5 
"V38173" NA 161.5 
"V38174" NA 14.5 

正如您所看到的,第一列中有一些NA,因为条目较少。请记住,也可能有更多列。问题是,我可以在任何栏目中有一个小提琴情节吗?

我已经试过这样:

jpeg("violinplot.jpg", width = 1000, height = 1000); 
do.call(vioplot,c(statsDataFrame, list(names=nameList))) 
dev.off() 

statsDataFrame是完整的数据帧我上面张贴。但是,当我运行脚本时,出现以下错误:

Error in quantile.default(data, 0.25) : 
    missing values and NaN's not allowed if 'na.rm' is FALSE 
Calls: do.call -> <Anonymous> -> quantile -> quantile.default 
Execution halted 

实质上是抱怨NA。我都试过na.rm = FALSE和na.rm = TRUE,像这样:

jpeg("stats/AllDistanceViolinPlot.jpg", width = 1000, height = 1000); 
do.call(vioplot,c(columnViolinDistanceDataUnlist,na.rm=FALSE,list(names=tfListRow))) 
dev.off() 

jpeg("stats/AllDistanceViolinPlot.jpg", width = 1000, height = 1000); 
do.call(vioplot,c(columnViolinDistanceDataUnlist,na.rm=TRUE,list(names=tfListRow))) 
dev.off() 

,但无济于事。

有没有人有任何建议如何做到这一点,或者如果可以做到?

谢谢你的帮助。

+0

我通常只使用ggplot小提琴地块。 http://docs.ggplot2.org/current/geom_violin.html –

+0

ggplot是否适用于不同的色谱柱长度? – intl

回答

5

您需要删除NA,这样可以避免将data.frame(不等长的列)作为容器数据结构,但您也希望使用do.call,该列表需要列表。所以我会用lapply剥离从data.frame的每一列都NA是因为每一个将作为列表元素返回的值,你仍可使用do.call(假设你的数据被称为df):

do.call(vioplot, lapply(df, function(x) x[!is.na(x)])) 

或者为@BrianDiggs指出,你可以使用更简洁和漂亮:

do.call(vioplot, lapply(df, na.omit)) 
+1

或者你可以用'na.omit'替换你的匿名函数:'do.call(vioplot,lapply(df,na.omit))' –

+0

@BrianDiggs啊,谢谢。我*总是*忘记了方便的'na.omit'并直接进行比较/子集化! –

+0

谢谢,它工作。解决方案简单 – intl