【问题标题】:Barplot dplyr summarized valuesBarplot dplyr 汇总值
【发布时间】:2018-05-15 15:58:41
【问题描述】:

我有前 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 值)。

我不知道该怎么做,有什么想法吗?

下面是变量similarReasonFreq

> 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")

感谢任何建议!

【问题讨论】:

  • 您能解释一下您是如何得到这些数字的:“因此,成本频率为 38,产品频率为 101”?
  • 我正在对频率列的 1:3 行中的值求和

标签: r plot dplyr


【解决方案1】:

您的数据结构使用起来有点尴尬,您可以对其执行strglimpse 来查看问题,但是您可以按如下方式解决此问题,然后绘制它。

> 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")

输出

在 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()

【讨论】:

  • 这太棒了!您知道我如何获得相对频率吗?成本的含义是 38/187 * 100 = 20.3%
  • 187 = 10 + 11+ 17 +149
  • @ElaineSlaven ,不清楚,大于 100% 的 productsC (31+40+30)/86 怎么办,这是不可能的。但是你可以使用绘图来做比例,使用..count../sum(..count..)
  • 相对频率将是 1:3 行的总和与所有 1:4 行的总和。所以 productsC 将是 101/187
  • 抱歉,您能否提供有关如何获得 rfreq 值的代码?你用summary了吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 2021-07-14
  • 1970-01-01
  • 2021-01-20
  • 2015-06-27
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多