R - 使用不同列的小提琴图

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

但是没有任何效果。

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

谢谢你的帮助。


我通常只使用ggplot来绘制小提琴图。http://docs.ggplot2.org/current/geom_violin.html - Roman Luštrik
ggplot能够处理不同列长度的数据吗? - intl
1个回答

5

您需要删除NA,这将使您无法使用data.frame(长度不等的列)作为容器数据结构,但您还想使用do.call来处理列表。因此,我建议使用lapply从数据框的每个列中剥离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)) - Brian Diggs
@BrianDiggs 哦,谢谢你。我总是忘记方便的na.omit,直接去比较/子集! - Simon O'Hanlon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接