Создание гистограмм из трубы dplyr

У меня есть набор данных, который я хочу group_by() и создать гистограмму для каждой группы. Мой текущий код выглядит следующим образом:

df %>%
  group_by(x2) %>%
  with(hist(x3,breaks = 50))

Однако это генерирует единую гистограмму всего x3, а не несколько фрагментов x3, вот некоторые примеры данных.

df = data.frame(x1 = rep(c(1998,1999,2000),9),
            x2 = rep(c(1,1,1,2,2,2,3,3,3),3),
            x3 = rnorm(27,.5))

желаемый результат:

Создание гистограмм из трубы dplyr

фактический результат:

Создание гистограмм из трубы dplyr

Базовые функции R, такие как hist, не заботятся о dplyr group_by.

Jack Brookes 01.03.2019 19:26
?do должно помочь
Gregor Thomas 01.03.2019 19:26

hist принимает только столбец данных, игнорируя вашу группировку. Вместо этого используйте ggplot или выполните

infominer 01.03.2019 19:28

@infominer OP передает на with, который принимает полный фрейм данных. Проблема в том, что внешние функции dplyr игнорируют группировку --- это верно как для ggplot, так и для with или hist.

Gregor Thomas 01.03.2019 19:32

@Грегор, ты тоже. Заметил это после того, как написал свой комментарий. с ggplot им придется фасетировать или иметь возможность использовать заливку для окрашивания полос.

infominer 01.03.2019 19:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
1 987
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я думаю, что пришло время перейти к ggplot, например:

library(tidyverse)

df %>% 
  ggplot(aes(x = x3)) + 
  geom_histogram(bins = 50) + 
  facet_wrap(~x2) # optional: use argument "ncols = 1"

Может быть, я что-то упустил, OP сделал включает образцы данных

camille 01.03.2019 19:39
facet_grid(rows = vars(x2)) больше соответствует ожидаемому результату OP. И в коде создания данных OP я добавил ноль к каждому вектору-столбцу.
Rui Barradas 01.03.2019 19:42

Однако я не вижу ничего в истории редактирования поста. Не имейте в виду, что это ошибка с вашим сообщением

camille 01.03.2019 19:46
Ответ принят как подходящий

Мой комментарий о do устарел, наверное. ?do указывает на текущий ?group_walk:

df %>%
 group_by(x2) %>%
 group_walk(~ hist(.x$x3))

В версиях dplyr < 0.8.0 group_walk нет, поэтому можно использовать do:

df %>% 
  group_by(x2) %>%
  do(h = hist(.$x3))

Предполагая, что вам нужны только побочные эффекты hist (печатная гистограмма), а не возвращаемые значения, вы можете добавить %>% invisible() в конец цепочки, чтобы не печатать результирующую табличку.

Откуда group_walk? sos::findFn('group_walk') найдено 0 совпадений.

Rui Barradas 01.03.2019 19:45

Это функция dplyr, возможно, вам придется обновить ее до самой последней версии пакета.

user2363777 01.03.2019 19:48

@RuiBarradas Я думаю, это было новым в dplyr 0.8.0. Я добавлю версию do для обратной совместимости.

Gregor Thomas 01.03.2019 20:06

Спасибо! Это делает именно то, что я хотел. можно ли передать другие аргументы в вызове group_walk()? Например, изменить основной заголовок на переменную группировки? Что-то вроде `main = .x$x2' (этот синтаксис не работает что-то о "неизвестном или неинициализированном столбце") -редактировать- разобрался, нужно инициализировать столбец с .y$x2

C. Denney 01.03.2019 20:54

Спасибо. Тем временем я обновил пакет dplyr.

Rui Barradas 01.03.2019 20:58

Вы можете использовать команду split.data.frame для разделения данных на основе категорий, после чего вы запускаете команду hist в списке кадров данных.

list_df <- split.data.frame(df, f= df$x2)
par(mfrow = c(round(length(list_df), 0), 1))

for( lnam in names(list_df)){
  hist(list_df[[lnam]][, "x3"])

}

split — это функция S3, поэтому, если вы просто используете split(df, f = df$x2), она отправит split.data.frame для вас.
Gregor Thomas 01.03.2019 20:20

Мне очень нравится ответ @Грегора с group_walk, но он все еще указан как экспериментальный в dplyr v0.8.0.1. Если вы хотите избежать работы с функциями, которые впоследствии могут сломаться, я бы использовал базу split, а затем purrr::walk. Я использую walk и plot, чтобы избежать распечатки всего текста, который дает hist.

library(dplyr)
library(purrr)

df %>%
  split(.$x2) %>%
  walk(~hist(.$x3) %>% plot())

Хороший ответ! Рассматривайте %>% invisible как более прямой/общий способ избежать вывода текста.

Gregor Thomas 01.03.2019 20:18

Другие вопросы по теме