【问题标题】:running a list through dplyr group_by and summarising & mutating each time通过 dplyr group_by 运行列表并每次汇总和变异
【发布时间】:2015-04-18 16:35:22
【问题描述】:

在使用 dplyr 时是否可以遍历列表并替换 group_by 变量?让我举例说明:

假设我有一个来自数据集 myData 的变量列表,每个变量都具有相同的组 1 到 10。理想情况下,我想遍历列表并为每个变量汇总和变异数据,如下所示。这可能吗?

这是一个较小的通用示例,但我只是将变量 a 放在 group_by 函数中,但理想情况下,我想遍历一个列表并获取每个变量的输出。

vars <- list(a,b,c)

> myData
   success a b c
1        0 2 1 3
2        1 1 3 1
3        1 1 3 1
4        0 1 1 3
5        1 2 2 1
6        1 2 3 2
7        0 2 2 3
8        0 1 1 3
9        0 2 3 2
10       1 1 1 2
11       1 1 2 2
12       0 1 1 1
13       0 3 1 1
14       1 3 2 1

> myData %>% group_by(a) %>% 
+     summarise(success = sum(success), n = n()) %>% 
+     mutate(success_prop = success / sum(n))
Source: local data frame [3 x 4]

  a success n success_prop
1 1       4 7   0.28571429
2 2       2 5   0.14285714
3 3       1 2   0.07142857

最终结果可能如下所示:

group   a.success   a.n a.success_prop  b.success   b.n b.success_prop  c.success   c.n c.success_prop
1         4          7  0.28571429          1        6  0.07142857          4         6   0.2857143
2         2          5  0.14285714          3        4  0.21428571          3         4   0.2142857
3         1          2  0.07142857          3        4  0.21428571          0         4   0

【问题讨论】:

  • 您能否将dput(myData) 添加到您的帖子中,以便您的示例可重现?
  • 我把问题改成了更通用的例子,所以它是可重现的
  • 所需输出的第一行有a.success = 4a.n = 7a.success_prop = 0.28。这似乎不一致。
  • 对,我想要相对频率
  • 啊。我知道了。请参阅下面我修改后的答案。

标签: r dplyr


【解决方案1】:

我建议您首先将您的数据转换为tidy 格式:

library(tidyr)
library(dplyr)

tidy_data <- myData %>%
  gather(key, value, a:c)

然后使用group_bysummarise 就很简单了。

编辑

tidy_data %>%
  group_by(key, value) %>%
  summarise(
    success = sum(success),
    n = n()
  ) %>%
  group_by(key) %>%
  mutate(
    success_prop = success / sum(n)
  )

【讨论】:

  • 这也可以,但我认为我喜欢不会在内存中创建另一个 data.frame 的解决方案
  • @moku - 如果您愿意,您可以轻松组合这两个操作链。我刚刚创建了中间对象来说明tidy_data的格式
  • 在这种情况下是真的,我认为它比 lapply 更快
  • 这个解决方案还把数据放在一个很好的长格式中,以便用 ggplot 绘图,所以我认为最终它具有最多的功能和速度。非常感谢@DMC
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2014-06-23
  • 2021-01-19
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多