根据各自的中位数绘制所有值

Plot all values against their respective medians

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

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 的值较少。这对于我的真实数据框来说也是如此,所以这绝对不是这样做的方法。

欢迎任何帮助或建议!

这可能是一种根据我的评论绘制数据箱线图的方法:

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

给你

编辑

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

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

而不是上面显示的代码 returns 这个情节

这似乎是你想要做的。

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)