Суммируйте пропорцию сгруппированной переменной в r - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь суммировать сгруппированные переменные, но я хочу получить сумму как пропорцию числа в каждой группе. Вот пример:

Создайте следующий фрейм данных:

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

Как мне изменить функцию суммирования, чтобы получить счетчик размера группы для каждой группы? Я был бы рад изменить другой столбец с размером группы, а затем рассчитать пропорцию, но не знаю, как получить этот размер группы. Само собой разумеется, что я пытаюсь сделать это для массивного набора данных.

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Мы можем получить пропорцию, используя na.rm из mean, то есть получить mean логического выражения (change > 0) при удалении `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
0 голосов
/ 16 января 2020

Вот базовое решение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...