Бокплоты на основе переменных-столбцов TRUE / FALSE - PullRequest
2 голосов
/ 06 марта 2020

У меня есть данные, которые можно приблизительно скопировать, используя

n = 10
df = data.frame(
  val= rnorm(n), 
  var1 = rbinom(n, 1, 0.5),
  var2 = rbinom(n, 1, 0.5),
  var3 = rbinom(n, 1, 0.5))

Как я могу нанести это на коробочный график? То, что я ищу, будет иметь var1, var2 и var3 на оси X и val на оси Y, то есть поле "уксус" для var1 будет содержать только наблюдения, которые имеют 1 в столбце var1.

Я пробовал

df2 = melt(df, id.vars = c('val'), 
           variable.name ='vars', value.name = "include")

ggplot(df2, aes(x = include, y = val)) + geom_boxplot(aes(fill = vars)

, но при построении графика я получаю 3 боксплота, которые выглядят абсолютно одинаково.

Где я ошибаюсь?

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

В базе R мы можем сделать

boxplot(sapply(df[-1], function(x) df$val[as.logical(x)]))

enter image description here

Или используя ggplot2

df.r <- do.call(rbind, lapply(names(df)[-1], function(x) 
  data.frame(x, y=df$val[as.logical(df[,x])])))

library(ggplot2)
ggplot(df.r, aes(x=x, y=y)) + geom_boxplot(aes(fill=y))

enter image description here


Данные

df <- structure(list(val = c(1.37095844714667, -0.564698171396089, 
0.363128411337339, 0.63286260496104, 0.404268323140999, -0.106124516091484, 
1.51152199743894, -0.0946590384130976, 2.01842371387704, -0.062714099052421
), var1 = c(1L, 0L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 1L), var2 = c(1L, 
1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 1L), var3 = c(0L, 0L, 0L, 1L, 
0L, 1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
-10L))
0 голосов
/ 06 марта 2020

Все поля одинаковы, потому что график не учитывает вектор include. Это обрабатывается инструкцией subset в аргументе ggplot data.

library(ggplot2)

ggplot(subset(df2, include != 0), aes(vars, val)) +
  geom_boxplot()

enter image description here

Код создания данных .

Я повторно отправляю код создания данных, устанавливающий начальное значение ГСЧ.

set.seed(1234)
n = 10
df = data.frame(
  val= rnorm(n), 
  var1 = rbinom(n, 1, 0.5),
  var2 = rbinom(n, 1, 0.5),
  var3 = rbinom(n, 1, 0.5))
df

df2 <- reshape2::melt(df, id.vars = c('val'), 
           variable.name ='vars', value.name = "include")
...