嵌套数据框中的计数和比例

问题描述 投票:0回答:1

我想计算几个子数据帧内的比例。我曾经用一些丑陋的代码来做到这一点,使用 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) 
丢失了。这里怎么介绍分组呢? 非常感谢!

r purrr
1个回答
0
投票

这是想要的输出吗?

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 创建

© www.soinside.com 2019 - 2024. All rights reserved.