Можно ли построить процентную долю подкатегории в ggplot без суммирования таблицы данных длинного формата? - PullRequest
1 голос
/ 20 апреля 2020

I w sh для построения «процентной положительности» в следующем наборе данных с использованием ggplot, и мне интересно, могу ли я сделать это без изменения набора данных.

Percentage Positivity = Pos / (Pos + Neg)

Код чтобы сгенерировать набор данных:

library(tidyverse)

set.seed(0)

df <- tibble(Result = c(rep("Pos", 6), rep("Neg",6)),
             Group1 = rep(1:6, 2), Group2 = rep(1:3, 4), Value = rnorm(12, 5, 2))

# A tibble: 12 x 4
   Result Group1 Group2 Value
   <chr>   <int>  <int> <dbl>
 1 Pos         1      1  7.53
 2 Pos         2      2  4.35
 3 Pos         3      3  7.66
 4 Pos         4      1  7.54
 5 Pos         5      2  5.83
 6 Pos         6      3  1.92
 7 Neg         1      1  3.14
 8 Neg         2      2  4.41
 9 Neg         3      3  4.99
10 Neg         4      1  9.81
11 Neg         5      2  6.53
12 Neg         6      3  3.40

Игнорируя Group2, позитив для Group1 = 1, например, будет 7.53/(7.53 + 3.14).

Я в основном пользователь PowerBI, и я новичок в R, поэтому вид кода, который я имею в виду, выглядит примерно так:

plot <- ggplot(data = df) +
  geom_col(aes(x = Group1, y = Value[where result = pos]/Value[where result = pos + neg))

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

Есть ли способ сделать то, что я прошу?

Рад выслушать мнения более опытных пользователей о лучших методах моделирования / визуализации.

1 Ответ

1 голос
/ 20 апреля 2020

Не уверен, что это будет именно тот ответ, который вы ищете, но "без" создания нового набора данных вы можете создать последовательность каналов, которая будет вычислять пропорции при наборе sh и передавать ее в ggplot.

Таким образом, вы можете «разрезать» ваши данные всеми возможными способами, о которых вы думаете, без изменения оригинала df.

Здесь, для вашего примера, вы можете сделать следующее:

library(dplyr)
library(ggplot2)

df %>% group_by(Group1) %>%
  mutate(Value2 = Value / sum(Value)) %>%
  filter(Result == "Pos") %>%
  ggplot(aes(x = factor(Group1), y = Value2))+
  geom_col()+
  geom_text(aes(label = scales::percent(Value2)), vjust = -0.5)
  scale_y_continuous(labels = scales::percent)

enter image description here

Это то, что вы ищете?

...