【问题标题】:Summarise proportion of grouped variable in r总结 r 中分组变量的比例
【发布时间】:2020-05-02 17:25:21
【问题描述】:

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

创建以下数据框:

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

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

【问题讨论】:

标签: r dplyr summarize


【解决方案1】:

我们可以利用na.rmmean中得到比例,即得到逻辑表达式(change &gt; 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   

如果缺少某些“国家”,那么我们可以对数据集执行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

【讨论】:

  • 谢谢,这是有道理的。但是,如果建立数据库的人不够勤奋,无法确保所有缺失的数据都由 NA 指示,而有些组只是其中的数据较少——即 1980 年只有国家 2、3、4;而 1990 年只有 3,4 个国家/地区?
  • @MorrisseyJ 然后你可以做一个completedat %&gt;% group_by(year) %&gt;% complete(country = unique(dat$country)) 并做res
【解决方案2】:

这是一个基本的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2022-01-14
    • 2021-03-26
    • 1970-01-01
    • 2019-05-03
    • 2021-01-04
    • 2022-12-09
    • 2020-04-10
    相关资源
    最近更新 更多