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

int*_*ntl 4 math plot r graph 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
Run Code Online (Sandbox Code Playgroud)

如您所见,第一列中有一些NA,因为条目较少.请记住,可能还有更多列.问题是,我可以在任何一列中都有NA的小提琴情节吗?

我试过这个:

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

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
Run Code Online (Sandbox Code Playgroud)

这基本上是抱怨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()
Run Code Online (Sandbox Code Playgroud)

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

但无济于事.

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

谢谢您的帮助.

Sim*_*lon 5

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

do.call( vioplot, lapply(df, function(x) x[!is.na(x)]) )
Run Code Online (Sandbox Code Playgroud)

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

do.call(vioplot, lapply(df, na.omit))
Run Code Online (Sandbox Code Playgroud)