汇总分组变量在 r 中的比例

Summarise proportion of grouped variable in 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

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

我们可以利用mean中的na.rm得到比例,即得到逻辑表达式(change > 0)的mean,同时去掉`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   

如果某些 'country' 缺失,那么我们可以对数据集执行 complete 以获取缺失值,然后执行 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

这是一个基本的 R 解决方案

dat <- within(dat, prop.positive<-ave(change, year, FUN = function(x) mean(x>0,na.rm = T)))
datout <- unique(dat[c("year","prop.positive")])

这样

> datout
  year prop.positive
1 1970          0.75
5 1980          1.00
9 1990          1.00