按逻辑变量分组的数字变量的箱线图

时间:2019-12-16 19:30:52

标签: r ggplot2 categorical-data

我有一个数据集,其中包含一个数字变量(PTV)和两个类别变量(habit和ffg),它们被列为这两个类别中每个类别的逻辑。因此,我有一系列名为HABIT_BU,FFG_SH,FFG_SC的列。我将如何创建箱形图,其中每个箱都是每个类别的TRUE观测值的PTV。以及如何格式化它,使最终结果看起来像这样的情节?enter image description here

谢谢!

1 个答案:

答案 0 :(得分:1)

因此,让我们假设您具有以下数据集:

PTV = rnorm(100)
HABIT_BU = c(rep(TRUE,50),rep(FALSE,50))
FFG_SH =  c(rep(TRUE,50),rep(FALSE,50))
FFG_SC =  c(rep(TRUE,50),rep(FALSE,50))

df <- data.frame(PTV, HABIT_BU, FFG_SH, FFG_SC)

所以虚拟数据集看起来像:

> head(df)
          PTV HABIT_BU FFG_SH FFG_SC
1 -0.14361156     TRUE   TRUE   TRUE
2 -1.36115367     TRUE   TRUE   TRUE
3  0.68461065     TRUE   TRUE   TRUE
4 -0.40292344     TRUE   TRUE   TRUE
5 -0.01070836     TRUE   TRUE   TRUE
6  0.44495130     TRUE   TRUE   TRUE

> str(df)
'data.frame':   100 obs. of  4 variables:
 $ PTV     : num  -0.1436 -1.3612 0.6846 -0.4029 -0.0107 ...
 $ HABIT_BU: logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ FFG_SH  : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ FFG_SC  : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...

它是否与您的实际数据集相对应? (如果没有,请提供可复制的数据集)

现在,我们可以使用tidyr

重塑您的数据
library(tidyr)
df %>% pivot_longer(.,-PTV, names_to = "Variable", values_to = "Values")

# A tibble: 300 x 3
      PTV Variable Values
    <dbl> <chr>    <lgl> 
 1 -0.144 HABIT_BU TRUE  
 2 -0.144 FFG_SH   TRUE  
 3 -0.144 FFG_SC   TRUE  
 4 -1.36  HABIT_BU TRUE  
 5 -1.36  FFG_SH   TRUE  
 6 -1.36  FFG_SC   TRUE  
 7  0.685 HABIT_BU TRUE  
 8  0.685 FFG_SH   TRUE  
 9  0.685 FFG_SC   TRUE  
10 -0.403 HABIT_BU TRUE  
# … with 290 more rows

我们可以使用ggplot进行绘制:

library(tidyr)
library(ggplot2)
df %>% pivot_longer(.,-PTV, names_to = "Variable", values_to = "Values") %>% 
  ggplot(.,aes(x = Values, y = PTV, fill = Values))+
  geom_boxplot()+
  facet_grid(.~Variable)

要获取此箱线图,请执行以下操作: enter image description here

如果只想绘制每个类别的TRUE值,则可以使用filter中的函数dplyr

library(dplyr)
library(tidyr)
library(ggplot2)
df %>% pivot_longer(.,-PTV, names_to = "Variable", values_to = "Values") %>% filter(., Values == TRUE) %>%
  ggplot(.,aes(x = Values, y = PTV, fill = Values))+
  geom_boxplot()+
  facet_grid(.~Variable)

您将获得: enter image description here

或者由于您的所有类别仅包含一个值,因此可以按以下方式绘制它们:

df %>% pivot_longer(.,-PTV, names_to = "Variable", values_to = "Values") %>% filter(., Values == TRUE) %>%
  ggplot(.,aes(x = Variable, y = PTV, fill = Variable))+
  geom_boxplot()

enter image description here

它回答了您的问题吗?

如果没有,请考虑提供一个可重复的数据集示例(请参见此处:How to make a great R reproducible example