gpt4 book ai didi

r - 使用带分位数的 geom_boxplot

转载 作者:行者123 更新时间:2023-12-02 05:08:56 25 4
gpt4 key购买 nike

问题

我想使用 ggplot 的 geom_boxplot 并为分位数段使用我自己的数据列,而不是 stat_boxplot 返回的数据列。

经过一些转换后的数据如下所示:

> allquartile                                                      
T method s.0% s.25% s.50% s.75% s.100%
1 2 LDA -196.76273 -190.38842 -184.01411 -177.63979 -171.26548
2 3 LDA -171.53987 -166.16923 -160.79859 -115.28652 -69.77446
3 4 LDA -161.17590 -157.61372 -149.71026 -124.68926 -69.77446
4 5 LDA -194.10553 -179.83165 -175.14337 -168.46104 -159.07206

经过大量的搜索和挖掘,我发现我的绘图命令应该是这样的:

p <- ggplot(allquartile,aes(x=T, ymin=`s.0%`, lower=`s.25%`,
middle=`s.50%`, upper=`s.75%`,
ymax=`s.100%`, color=method)) +
geom_boxplot(stat="identity")

应该使用 s.0% 作为最小值,s.25% 作为下限,等等。但是当我尝试显示 p 时,我得到了以下错误:

Error in eval(expr, envir, enclos) : object 's.0%' not found                                                                                                             
Calls: print ... lapply -> is.vector -> lapply -> FUN -> eval -> eval

我也尝试过使用 aes_string 代替 aes,但我得到了这个错误:

Error in aes_string(x = T, ymin = `s.0%`, lower = `s.25%`, middle = `s.50%`,  :                                                                                            
object 's.0%' not found

我对 R 和 ggplot2 都很陌生,所以我不太确定如何解释这个,但我假设这是因为 .s.0 %.

如果有任何关于如何解决此问题的建议,我将不胜感激。

编辑:我进行了更多研究,我认为这是由于我对分位数方法的误解所致。我通过以下命令创建了 allquartile:

allquartile <-aggregate(list(s=topicquality$score), list(T=topicquality$T,method=topicquality$method),FUN=quantile,probs=seq(0, 1, .25)) 

而且我意识到没有名为 score.0%score.25% 等的。只有 score 列有 5 个值。所以这归结为:我如何访问 score 中的这 5 个值?

解决方案

我发现我的数据集存在问题。正如我在编辑中提到的,根据我形成数据框的方式,score.0%score.25% 等列并不存在。例如,运行 colnames(allquartile) 返回:

[1] "T"      "method" "score"

事实证明,score 列是一个值向量。运行 allquartile$score 给我:

            0%       25%       50%       75%       100%
[1,] -196.7627 -190.3884 -184.0141 -177.6398 -171.26548
[2,] -171.5399 -166.1692 -160.7986 -115.2865 -69.77446
[3,] -161.1759 -157.6137 -149.7103 -124.6893 -69.77446
[4,] -194.1055 -179.8316 -175.1434 -168.4610 -159.07206
[5,] -200.1544 -174.2835 -167.7209 -145.3432 -129.54586

然后我可以通过以下方式访问每个分位数的值

> allquartile$score[,1]
[1] -196.7627 -171.5399 -161.1759 -194.1055 -200.1544

我对 R 不够熟悉,不知道这是什么类型的数据结构,但我会称它为矩阵。因此,就像任何好的矩阵对象一样,m[,column] 返回列的值,而 m[row,] 返回行的值,而 m [row, column] 获取单元格值。

考虑到这一点,我意识到正确的绘图命令应该是

p <- ggplot(allquartile,
aes(x=T,
ymin=score[,1],
lower=score[,2],
middle=score[,3],
upper=score[,4],
ymax=score[,5],
color=method)) +
geom_boxplot(stat="identity")

这完美地描绘出了一切。

感谢大家的好建议,虽然没有解决问题,但对解决问题帮助很大。

最佳答案

实际上,根据您的编辑,我认为您真正的问题是您不应该使用 aggregate。如果您应用的函数返回多个值(如 quantile),aggregate 默认以您观察到的有点不方便的格式返回结果。

事情是这样的。一个数据框,有点令人困惑,实际上是一个列表,每一列都是列表的一个元素。唯一的要求是每个“列”具有相同的行数。所以你得到一个包含三个“列”的数据框:第三列只是一个矩阵!

aggregate 做这个是可能的,但还有更方便的工具。 (例如,您可以调用 cbind(allquartile[,1:2],allquartile[,3]) 来创建“正确”维度的数据框。)

例如,一个非常流行的是来自 plyr 包的 ddply。下面是一个使用一些虚构数据的示例,但遵循数据的一般结构:

topicquality <- data.frame(score = runif(20),
T = rep(letters[1:2],each = 10),
method = rep(letters[3:4],length.out = 20))

ddply(topicquality,.(T,method),FUN = function(x,...){quantile(x$score,...)},probs = seq(0,1,0.25))

您会注意到,这将返回您期望的维度的数据框,但您仍然需要处理不方便的列名。这最好在您应用于每件作品的功能中处理:

myQuantile <- function(x,...){
tmp <- quantile(x,...)
names(tmp) <- NULL #Or something else convenient
tmp
}
ddply(topicquality,.(T,method),FUN = myQuantile,probs = seq(0,1,0.25))

关于r - 使用带分位数的 geom_boxplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7678261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com