【问题标题】:Plot all values against their respective medians根据各自的中位数绘制所有值
【发布时间】:2021-07-04 22:58:36
【问题描述】:

我有一个大型数据框,我计算了每行的中位数。为简单起见,这是我的数据框

df <- as.data.frame(rbind(c(1,2,3),c(2,2,5),c(5,4,5),c(5,6,5),c(2,6,6)))
df$median = apply(df, 1, median, na.rm=T)
df
  V1 V2 V3 median
1  1  2  3      2
2  2  2  5      2
3  5  4  5      5
4  5  6  5      5
5  2  6  6      6

现在我想根据各自的中位数制作所有值的箱线图。因此,将有一个 x 轴,其中位数为 2、5 和 6,并且在 y 轴上计算中位数的所有值。

我对 R 很陌生,不知道该怎么做。我用作弊数据框做了一个图来说明我想要什么:

df2 <- cbind(c(1,2,3,2,2,5),c(5,4,5,5,6,5),c(4,6,6))
colnames(df2) <- c("2","5","6")

df2
     2 5 6
[1,] 1 5 4
[2,] 2 4 6
[3,] 3 5 6
[4,] 2 5 4
[5,] 2 6 6
[6,] 5 5 6

boxplot(df2, xlab="median")

如何通过代码实现这一点?如您所见,第三列的值重复,因为对应于中位数 6 的值较少。这对于我的真实数据帧当然也是如此,所以这绝对不是这样做的方法。

欢迎任何帮助或建议!

【问题讨论】:

  • 对我来说,这没有意义。通常,箱线图显示中位数,您不会将其放在 x 轴上。在您的情况下,基于df,我将为每一行创建一个箱线图,将行号放在 x 轴上,将值放在 y 轴上。
  • 感谢您的回复!我同意这可能是一种不直观的绘图方式。我的真实数据框有点大(6000 行),所以我真的很想按各自的中位数对数据进行分组,以获得更少的箱线图。
  • 如果两行的中位数相同,绘图会是什么样子?您想要多个具有相同中位数的箱线图,还是想要一个组合数据的箱线图?
  • 每个中位数的一个箱线图,无论有多少值/观察导致该中位数。所以如果我有 3 个独特的中位数,我想要 3 个箱线图。我想知道如何开始这样做。我的猜测是我需要根据中位数对我的数据进行子集化,制作单独的箱线图并将它们组合到 ggplot 中。这听起来对你有意义吗?
  • 听起来不错。但是,如果您没有唯一的中位数会怎样?

标签: r boxplot median


【解决方案1】:

这可能是一种根据我的评论对数据进行箱形图的方法:

library(ggplot2)
library(tidyr)
library(dplyr)

df %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(cols=c(-median, -id)) %>% 
  ggplot(aes(x=id, y=value, group=id)) +
  geom_boxplot()

给你

编辑

根据您的 cmets,我认为您可以使用

df %>% 
  pivot_longer(cols=c(-median)) %>% 
  ggplot(aes(x=median, y=value, group=median)) +
  geom_boxplot()

而不是上面显示的返回此图的代码

【讨论】:

    【解决方案2】:

    这似乎是你想要做的。

    stk <- data.frame(stack(df[, 1:3]), median=df$median)
    

    这将产生一个像你的图片一样的箱线图,但中位数 6 将仅基于 3 个值:

    table(stk$median)
    # 
    # 2 5 6 
    # 6 6 3 
    

    使用条形图可能会提供更多信息:

    stripchart(values~median, stk, method="stack", xlab="median", vert=TRUE)
    

    【讨论】:

    • 感谢您方便的stack 功能。这非常接近我的需要。我现在尝试不使用它来提取我的数据框中所有导致中位数相同值的行并分别制作箱线图。
    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2019-09-12
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多