汇总分组变量在 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
我想总结一个分组变量,但我想得到总和作为每个组中数字的比例。这是一个例子:
创建以下数据框:
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