группировка и построение по значению текстового столбца - PullRequest
0 голосов
/ 25 сентября 2019

Я имею (очень) базовый уровень компетенции в R при работе с числами, но когда дело доходит до манипулирования данными на основе текстовых значений в столбцах, я застрял.Например, если я хочу построить график зависимости частоты приема пищи от дня недели (действительно ли вторник для тако?) С использованием следующего фрейма данных, как мне это сделать?Я видел предложения tapply, aggregate, colSums и других, но все они были для немного разных сценариев, и ничто не дает мне то, что я ищу.Должен ли я смотреть на что-то другое, чем R для этой проблемы?Моя конечная цель - график с указанием дня недели на оси X, подсчета на оси Y и линейного графика для каждого приема пищи.

df <- data.frame(meal= c("tacos","spaghetti","burgers","tacos","spaghetti",
"spaghetti"), day = c("monday","tuesday","wednesday","monday","tuesday","wednesday"))

Это так близко, как я получил,и, если честно, я не до конца понимаю, что он делает:

tapply(df$day, df$meal, FUN = function(x) length(x))

Он будет суммировать количество приемов пищи, но а) у него нет имен столбцов (насколько я понимаю, это связано свозвращая вектор), и б) он не сохраняет связь с днем ​​недели.

Редактировать: Предложение melt(), приведенное ниже, работает для этого набора данных, но не масштабируется до размераЯ нуждаюсь.Однако я смог получить рабочий график из кадра данных, созданного расплавом.Если кто-нибудь столкнется с этим в будущем, попробуйте:

ggplot(new, aes(day, value, group=meal, col=meal)) + 
geom_line() + geom_point() + scale_y_continuous(breaks = function(x) 
unique(floor(pretty(seq(0, (max(x) + 1) * 1.1)))))

(Часть после geom_point() состоит в том, чтобы заставить ось Y быть только целыми числами, что имеет смысл в этом случае.)

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Волшебство здесь, благодаря @fmarm:

df_count <- df %>% group_by(meal,day) %>% count() %>% ungroup()

Биты fill_0 и rbind также в образце, предоставленном @fmarm, необходимы для предотвращения бомбардировки неуказанныхкомбинации, но это строка выше, которая обрабатывает суммирование блюд в день.

0 голосов
/ 25 сентября 2019

Я попытался разрезать это на более мелкие кусочки, чтобы вы могли понять, что происходит

library(tidyverse)
# defining the dataframes
df <- data.frame(meal = c("tacos","spaghetti","burgers","tacos","spaghetti","spaghetti"), 
                 day = c("monday","tuesday","wednesday","monday","tuesday","wednesday"))
# define a vector of days of week ( will be useful to display x axis in the correct order)
ordered_days =c("sunday","monday","tuesday","wednesday",
            "thursday","friday",'saturday')

# count the number of meals per day of week

df_count <- df %>% group_by(meal,day) %>% count() %>% ungroup()

# a lot of combinations are missing, for example no burgers on monday
# so i am creating all combinations with count 0
fill_0 <- expand.grid(
                  meal=factor(unique(df$meal)),
                  day=factor(ordered_days),
                  n=0)
# append this fill_0 to df_count
# as some combinations already exist, group by again and sum n 
# so only one row per (meal,day) combination
df_count <- rbind(df_count,fill_0) %>% 
                    group_by(meal,day) %>% 
                    summarise(n=sum(n)) %>% 
                    mutate(day=factor(day,ordered=TRUE,
                     ordered_days))

# plot this by grouping by meal
ggplot(df_count,aes(x=day,y=n,group=meal,col=meal)) + geom_line()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...