Barplot dplyr суммированные значения - PullRequest
0 голосов
/ 15 мая 2018

У меня есть данные из топ-3 рейтинга. Я пытаюсь создать график, который будет иметь по оси x имя столбца (стоимость / продукт), а значение y будет частотой (в идеале относительная частота, но я не уверен, как получить это в dplyr).

Я пытаюсь создать это по частям из значений, суммированных в dplyr. У меня есть фрейм данных dplyr, который выглядит примерно так:

likelyReasonFreq<-    LikelyRenew_Reason %>%
      filter(year==3)%>%
      filter(status==1)%>%
      summarize(costC = count(cost), 
                productsC = count(products))



   > likelyReasonFreq
          costC.x   costC.freq   productsC.x  productsC.freq
     1       1         10           1             31
     2       2         11           2             40
     3       3         17           3             30
     4      NA        149          NA             86

Я пытаюсь создать график, который показывает общую (суммированную) частоту как для стоимости, так и для продуктов. Таким образом, частота для стоимости будет частотой для числа раз ранжированных 1, 2 или 3, так что 38. По сути, я суммирую строки 1: 3 (для продуктов это будет 101 (не включая значения NA).

Я не уверен, как это сделать, есть идеи ??

ниже - переменная вероятноReasonFreq

> dput(head(likelyReasonFreq))
 structure(list(costC = structure(list(x = c(1, 2, 3, NA), freq = c(10L, 
  11L, 17L, 149L)), .Names = c("x", "freq"), row.names = c(NA, 
  4L), class = "data.frame"), productsC = structure(list(x = c(1, 
  2, 3, NA), freq = c(31L, 40L, 30L, 86L)), .Names = c("x", "freq"
  ), row.names = c(NA, 4L), class = "data.frame")), .Names = c("costC", 
  "productsC"), row.names = c(NA, 4L), class = "data.frame")

Я ценю любой совет!

1 Ответ

0 голосов
/ 15 мая 2018

С вашей структурой данных работать немного неудобно, вы можете указать str или glimpse, чтобы увидеть проблему, однако вы можете исправить это, как показано ниже, и затем построить ее.

> str(df)
'data.frame':   4 obs. of  2 variables:
 $ costC    :'data.frame':  4 obs. of  2 variables:
  ..$ x   : num  1 2 3 NA
  ..$ freq: int  10 11 17 149
 $ productsC:'data.frame':  4 obs. of  2 variables:
  ..$ x   : num  1 2 3 NA
  ..$ freq: int  31 40 30 86

Код для составления графика:

library(ggplot2)
library(tidyverse)
df <- df %>% map(unnest) %>% bind_rows(.id="Name") %>% na.omit() #fixing the structure of column taken as a set of two separate columns

df %>% 
    ggplot(aes(x=Name, y= freq)) +
    geom_col()

Я надеюсь, что это то, что ожидается, хотя я не совсем уверен в этом.

Входные данные даны :

df <- structure(list(costC = structure(list(x = c(1, 2, 3, NA), freq = c(10L, 
  11L, 17L, 149L)), .Names = c("x", "freq"), row.names = c(NA, 
  4L), class = "data.frame"), productsC = structure(list(x = c(1, 
  2, 3, NA), freq = c(31L, 40L, 30L, 86L)), .Names = c("x", "freq"
  ), row.names = c(NA, 4L), class = "data.frame")), .Names = c("costC", 
  "productsC"), row.names = c(NA, 4L), class = "data.frame")

выход

enter image description here

Добавлено после запроса OP:

Здесь я не удалил NA, а заменил их новым значением '4'. Чтобы взять относительную сумму по группам, я использовал cumsum, а затем разделил на всю сумму по обеим группам, чтобы получить относительные частоты.

df <- df %>% map(unnest) %>% bind_rows(.id="Name") 

df[is.na(df$x),"x"] <- 4

df %>% 
    group_by(Name) %>% 
    mutate(sum_Freq = sum(freq), cum_Freq = cumsum(freq)) %>% 
    filter(x == 3) %>% 
    mutate(new_x = cum_Freq*100/sum_Freq) %>% 
    ggplot(aes(x=Name, y = new_x)) +
    geom_col()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...