R: ddply - агрегирует данные, назначая строку в качестве имени переменной - PullRequest
0 голосов
/ 23 февраля 2019

Мне дан большой набор данных с несколькими столбцами.В качестве примера

set.seed(1)
x <- 1:15
y <- letters[1:3][sample(1:3, 15, replace = T)]
z <- letters[10:13][sample(1:3, 15, replace = T)]
r <- letters[20:24][sample(1:3, 15, replace = T)]
df <- data.frame("Number"=x, "Section"=y,"Chapter"=z,"Rating"=r)
dput(df)

structure(list(Number = 1:15, Area = structure(c(1L, 2L, 2L, 3L, 1L, 3L, 3L, 2L, 2L, 1L, 1L, 1L, 3L, 2L, 3L), .Label = c("a", "b", "c"), class = "factor"), Section = structure(c(2L, 3L, 3L, 2L, 3L, 3L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 3L, 2L), .Label = c("j", "k", "l"), class = "factor"), Rating = structure(c(2L, 2L, 2L, 1L, 3L, 3L, 3L, 1L, 3L, 2L, 3L, 2L, 3L, 2L, 2L), .Label = c("A", "B", "C"), class = "factor")), class = "data.frame", row.names = c(NA,-15L))

Теперь я хотел бы создать таблицы частот и графики, разделенные по рейтингу и выбранной категории, например, через строку:

Category<-"Section"
data_count <- ddply(df, .(get(Category),Rating), 'count')
data_rel_freq <- ddply(data_count, .(Rating), transform, rel_freq = freq/sum(freq))
dput(data_rel_freq)

structure(list(get.Category. = structure(c(2L, 2L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 2L, 2L, 3L, 3L), .Label = c("j", "k","l"), class = "factor"), Number = c(4L, 8L, 10L, 12L, 1L, 15L, 2L, 3L, 14L, 7L, 9L, 11L, 13L, 5L, 6L), Area = structure(c(3L, 2L, 1L, 1L, 1L, 3L, 2L, 2L, 2L, 3L, 2L, 1L, 3L, 1L, 3L), .Label = c("a", b", "c"), class = "factor"), Section = structure(c(2L, 2L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 2L, 2L, 3L, 3L), .Label = c("j", "k", "l"), class = "factor"), Rating = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), freq = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), rel_freq = c(0.5, 0.5, 0.142857142857143, 0.142857142857143, 0.142857142857143, 0.142857142857143, 0.142857142857143, 0.142857142857143, 0.142857142857143, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667)), class = "data.frame", row.names = c(NA, -15L))

Использование ggplot

ggplot(data_rel_freq,aes(x = Rating, y = rel_freq,fill = get(Category)))+ 
geom_bar(position = "fill",stat = "identity",color="black") +
scale_y_continuous(labels = percent_format())+ 
labs(x = "Rating", y="Relative Frequency")

enter image description here

Теперь проблема в том, что «get (Category)» теперь обрабатывается как новый столбец

    get.Category. Number Area Section Rating freq  rel_freq
1              k      4    c       k      A    1 0.5000000
2              k      8    b       k      A    1 0.5000000
3              j     10    a       j      B    1 0.1428571
4              j     12    a       j      B    1 0.1428571
5              k      1    a       k      B    1 0.1428571
6              k     15    c       k      B    1 0.1428571
7              l      2    b       l      B    1 0.1428571

Кроме того,Числовой столбец должен быть суммирован, например, другие категории (здесь: Площадь) должны быть отброшены, и у нас должна быть только одна строка для раздела "k" с рейтингом "A".

1 Ответ

0 голосов
/ 23 февраля 2019

Мы можем использовать count, чтобы получить частоту столбца «Раздел» путем оценки идентификатора объекта «Категория» после преобразования в символ (sym) и его оценки (!!).В синтаксисе ggplot aes также может принимать символ и может оцениваться как ранее

library(tidyverse)
library(scales)
library(ggplot2)
df %>% 
    count(!! rlang::sym(Category), Rating) %>%
    group_by(Rating) %>% 
    mutate(rel_freq = n/sum(n)) %>%
    ggplot(., aes(x =Rating, y = rel_freq, fill = !! rlang::sym(Category))) + 
    geom_bar(position = "fill",stat = "identity",color="black") + 
    scale_y_continuous(labels = percent_format())+ 
    labs(x = "Rating", y="Relative Frequency")

-выход

enter image description here

...