【问题标题】:Is there a way to perform a summary function separate from the grouping?有没有办法执行与分组分开的汇总功能?
【发布时间】:2021-08-11 23:47:04
【问题描述】:

我有一个格式如下的数据框:

           Person Answer Value
            John     Yes     3
            Pete     No      6
            Joan     Yes     5
            Joan     Yes     4     
            Pete     No      7

我想进行分析(并创建堆积条形图),我可以在其中按 Person(重复)和 Answer 变量分组,然后按值进行汇总。

我尝试使用 dplyr 来执行此操作,但遇到了问题。如果我在 dplyr 管道中使用 group_by 子句,我尝试执行该功能的值会受到阻碍。

例如,

df2 <- df %>%
select(Person, Answer, Value) %>%
group_by(Person, Answer) %>%
summarise(sum(value = 3)/length(original dataframe ungrouped) + sum(value = 6)/length(original dataframe ungrouped) 

我遇到的问题是正确执行此计算。数据分组后计算没有意义,因为分组后我最终返回了一个非常有限的数据帧。

预期输出:

    person answer value
    Joan   Yes.    calculated value (summary stat)
    Joan   No.     calculate value 
    John   Yes.    calculated value....
 ​   John   No
    Pete   Yes
    Pete   No

最后,我想制作一个堆积条形图,其中汇总显示在人员中,条形按“是”和“否”答案划分为百分比。例如,有 3 个小节:1 个代表 John,1 个代表 Pete,1 个代表 Joan,每个小节分为两部分(基于是/否响应的值)

谢谢!

【问题讨论】:

  • 请同时显示您的预期输出。什么是'var1'、'var2'、'var3'
  • 好像和上一个问题有关:stackoverflow.com/questions/68747743/…我们需要更多关于上下文的解释。
  • 看你之前的问题(stackoverflow.com/questions/68747743/…)我可以看到crestor,akrun和TarJae都在努力帮助你天真。我认为您应该花一些时间学习 how to create a good question 并提供更多详细信息以帮助我们帮助您(并避免浪费我们的时间),这似乎是公平的
  • 您可以使用== 在 R 中获取逻辑值。您只能使用 = 进行分配。
  • 我试图提供更多细节。将来,我一定会提供更好的示例。感谢所有帮助。

标签: r function dplyr stacked-chart


【解决方案1】:

我不明白你想要的结果是什么;这些都适合吗?

library(tidyverse)

df <- read.table(text = "Person Answer Value
 John     Yes     3
 Pete     No      6
 Joan     Yes     5
 John     No      6
 Pete     No      1", header = TRUE)

df2 <- df %>%
  group_by(Person) %>%
  mutate(proportion = Value / sum(Value))
df2
#> # A tibble: 5 x 4
#> # Groups:   Person [3]
#>   Person Answer Value proportion
#>   <chr>  <chr>  <int>      <dbl>
#> 1 John   Yes        3      0.333
#> 2 Pete   No         6      0.857
#> 3 Joan   Yes        5      1    
#> 4 John   No         6      0.667
#> 5 Pete   No         1      0.143

ggplot(df2, aes(x = Person, y = Value, fill = Answer)) +
  geom_col(color = "black", position = "stack") +
  geom_text(aes(label = Answer),
            position = position_stack(vjust = 0.5))

ggplot(df2, aes(x = Person, y = proportion, fill = Answer)) +
  geom_col(color = "black", position = "stack") +
  geom_text(aes(label = round(proportion, 2)),
            position = position_stack(vjust = 0.5))

reprex package (v2.0.0) 于 2021-08-12 创建

【讨论】:

  • 考虑到稀疏信息,这是一个非常好的答案!
  • 是的,类似于我正在尝试做的事情。为了提供更多细节,对于每个酒吧,我希望它分为两个政党(投票赞成或反对)。数据集中的每个人都被重复表示,每个受访者都提供了一个关于他们支持候选人的可能性的值。在这种情况下,三个人(候选人)是 John、Joan 和 Pete。感谢大家的帮助!
  • 哦,这更有意义 - 所以我回答中的第二个情节基本上就是你想要做的?您还想做出哪些进一步的改变?
  • @naiverat :不,不,不。不要使用 cmets 来澄清您的问题。相反,请使用 SO 的 edit 设施来改进问题正文中的示例。
  • @jared_mamrot 我认为你已经提供了足够的帮助,我可以从这里拿走它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多