R - 具有不同列的小提琴图

时间:2013-07-18 22:13:35

标签: r math graph plot dataframe

我正在寻找一种方法来绘制带有许多小提琴(列)的小提琴情节。问题是我的列长度各不相同。例如,它是这样的:

"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,因为条目较少。请记住,可能还有更多列。问题是,我可以在任何一列中都有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()

但无济于事。

有没有人对如何做到这一点或是否可以做到有任何建议?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

您需要删除不允许您使用data.frame(不等长列)作为容器数据结构的NA,但您还需要使用do.call来获取列表。因此,我会使用lapplyNA的data.frame的每一列中删除值,因为每个列都将作为列表元素返回,您仍然可以使用do.call(假设您的数据被称为df):

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

或者 @BrianDiggs 指出,你可以使用更简洁漂亮的东西:

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