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

Boxplots of numeric variable grouped by logical variables

我有一个包含一个数值变量 (PTV) 和两个分类变量(habit 和 ffg)的数据集,这两个分类变量被列为逻辑变量。所以我有一系列名为 HABIT_BU、FFG_SH、FFG_SC 的列。我将如何创建箱形图,其中每个箱子是每个类别的 TRUE 观察值的 PTV。我将如何格式化它以使最终结果看起来像这个图?

谢谢!

假设您有以下数据集:

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)

要获取此箱线图:

如果您只想绘制每个类别的 TRUE 值,您可以使用 dplyr:

中的函数 filter
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)

你会得到:

或者由于您的所有类别只包含一个值,您可以这样绘制它们:

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

它能回答您的问题吗?

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