首页 > 解决方案 > 总结 r 中分组变量的比例

问题描述

我试图总结一个分组变量,但我想得到总和作为每个组中数字的比例。这是一个例子:

创建以下数据框:

dat <- data.frame(year = c(rep(1970, 4), rep(1980, 4), rep(1990, 4)), 
                  country = rep(1:4, 3), 
                  change = c(0.1, 0.1, 0.1, -0.1, NA, 0.1, 0.1, 0.1, NA, NA, 0.1, 0.1))
> dat
   year country change
1  1970       1    0.1
2  1970       2    0.1
3  1970       3    0.1
4  1970       4   -0.1
5  1980       1     NA
6  1980       2    0.1
7  1980       3    0.1
8  1980       4    0.1
9  1990       1     NA
10 1990       2     NA
11 1990       3    0.1
12 1990       4    0.1

我可以计算出经历积极变化的国家数量:

dat %>%
  mutate(change.true = ifelse(change > 0, 1, 0)) %>%
  group_by(year) %>%
  summarise(count.positive = sum(change.true))

# A tibble: 3 x 2
   year count.positive
  <dbl>          <dbl>
1  1970              3
2  1980              3
3  1990              2

这表明出现积极变化的国家数量稳定或减少。然而,这是有数据的国家数量减少的结果(我知道我需要谨慎处理缺失的数据)。我想探讨的是有数据的国家的比例是如何变化的。基本上我想要这个:

data.frame(year = c(1970, 1980, 1990), 
           prop.positive = c(0.75, 1, 1))
  year prop.positive
1 1970          0.75
2 1980          1.00
3 1990          1.00

如何修改汇总函数以便计算每个组的组大小?我很乐意用组大小改变另一列,然后计算比例,但不知道如何获得该组大小。不用说,我正在尝试为大量数据集执行此操作。

标签: rdplyrsummarize

解决方案


我们可以通过使用na.rmfrom meanie get the meanof 逻辑表达式 ( change > 0) 得到比例,同时去掉 `NA

library(dplyr)
dat %>% 
    group_by(year) %>% 
    summarise(prop.positive = mean(change > 0, na.rm = TRUE))
# A tibble: 3 x 2
#   year prop.positive
#  <dbl>         <dbl>
#1  1970          0.75
#2  1980          1   
#3  1990          1   

如果缺少一些“国家”,那么我们可以complete对数据集执行 a 以获取缺失值,然后执行group_by summarise

library(tidyr)
dat %>%
  complete(year, country) %>%
  group_by(year) %>%
  summarise(prop.positive = mean(change > 0, na.rm = TRUE))

base R中,我们可以做同样的事情aggregate

aggregate(cbind(prop.positive = change > 0) ~ year, dat,
           mean, na.rm = TRUE, na.action = na.pass)
#   year prop.positive
#1 1970          0.75
#2 1980          1.00
#3 1990          1.00

推荐阅读