Как получить доступ к некоторым определенным c классам в столбце с помощью r? - PullRequest
1 голос
/ 07 мая 2020

У меня проблемы с доступом к определенным c классам в столбце. У меня есть фрейм данных, как показано ниже:

library(ggplot2)
library(dplyr)

dat <- data.frame(
  time = factor(c("Breakfast","Breakfast","Breakfast","Breakfast","Breakfast","Lunch","Lunch","Lunch","Lunch","Lunch","Lunch","Dinner","Dinner","Dinner","Dinner","Dinner","Dinner","Dinner"), levels=c("Breakfast","Lunch","Dinner")),
  class = c("a","a","b","b","c","a","b","b","c","c","c","a","a","b","b","b","c","c"))

В столбце time меня интересует обнаружение только Breakfast и Dinner для классов a, b и c Итак из этого фрейма данных я просто хочу просмотреть его в таблице, и он будет выглядеть так:

            a    b    c
Breakfast   2    2    1
Dinner      2    3    2

поэтому для каждого класса a, b, c я хочу нарисовать две полосы. Например, класс a одна полоса представляет: Среднее значение Breakfast по сравнению с другими классами: 2 / (2 + 2 + 1), а одна другая полоса представляет Dinner по сравнению с другими классами: 2 / (2 + 3 + 2) и установите для них разные цвета. Я хочу сделать то же самое для класса b и класса c.

Любая помощь для этого будет принята с благодарностью.

1 Ответ

1 голос
/ 07 мая 2020

Мы можем subset и table после сброса levels с droplevels

table(droplevels(subset(dat, time %in% c("Breakfast", "Dinner"))))
#           class
#time        a b c
#  Breakfast 2 2 1
# Dinner    2 3 2

Если нам нужен barplot

barplot(prop.table(table(droplevels(subset(dat, time %in% 
            c("Breakfast", "Dinner")))), 1), beside = TRUE)

Или с помощью ggplot

library(dplyr)
library(ggplot2)
dat %>% 
   filter(time %in% c("Breakfast", "Dinner")) %>%
   droplevels %>%
   count(time, class) %>% 
   group_by(time) %>% 
   mutate(prop = n/sum(n)) %>%
   ggplot(aes(x = class, y = prop, fill = time, label = scales::percent(prop))) +
   geom_col(position = 'dodge') +
   geom_text(position = position_dodge(width = 0.9), vjust = 0.5, size = 3) + 
   scale_y_continuous(labels = scales::percent)
...