我想计算几个子数据帧内的比例。我曾经用一些丑陋的代码来做到这一点,使用 lapply 并创建和循环遍历许多对象。使用 purrr 包这应该更简单,但是到目前为止我还没有做到。
使用标准 R 数据集“mtcars”的插图:
以下代码是标准的dplyr解决方案(有效):
mtcars%>% group_by(vs, am) %>% summarise(n = n()) %>% mutate(freq = prop.table(n))
因此,我得到了“vs”(0 和 1)级别内的比例和计数。但是,我想计算“碳水化合物”的几个子组中的分组计数和比例。所以对于标准的 dplyr 这看起来像那样(也有效):
mtcars %>% filter(carb == 1) %>% summarise(n = n()) %>% mutate(freq = prop.table(n))
mtcars %>% filter(carb == 2) %>% summarise(n = n()) %>% mutate(freq = prop.table(n))
等等
这可行但很麻烦。
有了 Purrr,它应该看起来像这样:
mtcars %>% group_by(carb) %>% nest() %>% mutate(n = map(data, count))
但是在这里,分组
group_by(vs, am)
丢失了。这里怎么介绍分组呢?
非常感谢!
这是想要的输出吗?
library(tidyverse)
unique(mtcars$carb) %>% map_dfr(~ mtcars %>%
group_by(vs, am) %>%
filter(carb == .x) %>%
summarise(carb = .x, n = n(),.groups = 'drop') %>%
group_by(vs) %>%
mutate(freq = prop.table(n)))
#> # A tibble: 12 × 5
#> # Groups: vs [2]
#> vs am carb n freq
#> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 0 0 4 5 0.625
#> 2 0 1 4 3 0.375
#> 3 1 0 4 2 1
#> 4 1 0 1 3 0.429
#> 5 1 1 1 4 0.571
#> 6 0 0 2 4 0.8
#> 7 0 1 2 1 0.2
#> 8 1 0 2 2 0.4
#> 9 1 1 2 3 0.6
#> 10 0 0 3 3 1
#> 11 0 1 6 1 1
#> 12 0 1 8 1 1
由 reprex 包 (v2.0.1) 于 2022-01-06 创建