总结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