总结r中分组变量的比例
我试图总结一个分组变量,但我想得到每个组中数字的比例。以下是一个例子: 创建以下数据帧:总结r中分组变量的比例,r,dplyr,summarize,R,Dplyr,Summarize,我试图总结一个分组变量,但我想得到每个组中数字的比例。以下是一个例子: 创建以下数据帧: 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 <- 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
如何修改summary函数,以便获得每个组的组大小计数?我很乐意用组大小对另一列进行变异,然后计算比例,但不知道如何得到组大小。不用说,我正试图为一个庞大的数据集这样做 我们可以利用
na.rm
从mean
中得到比例,即在去掉`na>的同时得到逻辑表达式(change>0
)的mean
)
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
在
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")])
谢谢,这很有道理。然而,如果建立数据库的人没有足够努力确保所有缺失的数据都由NA表示,而有些群体中的数据却很少——即1980年只有国家2、3、4;1990年只有国家3,4?@MorrisseyJ那么你可以做一个
complete
,即dat%>%groupby(year)%%>%complete(country=unique(dat$country))
这能回答你的问题吗?
library(tidyr)
dat %>%
complete(year, country) %>%
group_by(year) %>%
summarise(prop.positive = mean(change > 0, na.rm = TRUE))
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
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