4

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

"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()

但无济于事。

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

谢谢您的帮助。

4

1 回答 1

5

您需要删除 NA,这会阻止您将data.frame(不等长度的列)作为容器数据结构,但您还想使用do.callwhich 需要一个列表。因此,我将使用lapply从 data.frame 的每一列中剥离NAs 的值,因为每一个都将作为列表元素返回,并且您仍然可以使用do.call(假设您的数据被调用df):

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

或者正如@BrianDiggs指出的那样,您可以使用更简洁漂亮的:

do.call(vioplot, lapply(df, na.omit))
于 2013-07-18T22:29:40.537 回答