Таблица частот, но пользовательская функция вместо счетчика по умолчанию? - PullRequest
1 голос
/ 29 октября 2019

Предположим, у меня есть фрейм данных:

bla <- data.frame(
  a = c(1,1,1,0,0,1,1,1,0,0),
  b = c(0,0,0,1,1,0,0,1,1,0),
  c = c(1,0,1,0,1,0,1,0,1,0),
  d = c(2,3,4,7,8,6,5,2,1,0)
)

Я могу использовать table (), чтобы получить число каждой комбинации 1/0 для каждого из a, b и c:

table(bla %>% select(a:c)) %>% as.data.frame()

  a b c Freq
1 0 0 0    1
2 1 0 0    2
3 0 1 0    1
4 1 1 0    1
5 0 0 1    0
6 1 0 1    3
7 0 1 1    2
8 1 1 1    0

Вот мой вопрос, есть ли способ вернуть как частоту, так и среднее значение столбца d для каждой комбинации a, b и c?

Т.е. это выглядит как table() auto groups byкаждая отдельная комбинация затем возвращает count() (поле Freq). Могу ли я сделать то же самое, но добавить mean ()?

Ответы [ 2 ]

3 голосов
/ 29 октября 2019

Вот базовое R решение с использованием aggregate:

aggregate(d ~ ., data = bla, 
          FUN = function(x) c('mean' = mean(x), 'count' = length(x)))

И пакет dplyr также может быть удобен (это было бы моим предпочтением):

library(dplyr)
bla %>%
    group_by(a, b, c) %>% # or group_by_at(-vars(d))
    summarise(count = n(),
              mean_d = mean(d))
2 голосов
/ 29 октября 2019

Если вы хотите, чтобы также отсутствовали комбинации, с dplyr и tidyr вы можете сделать:

bla %>%
 complete(a, b, c) %>%
 group_by_at(1:3) %>%
 summarise(count = sum(!is.na(d)),
           mean = mean(d))

      a     b     c count  mean
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     0     0     0     1  0   
2     0     0     1     0 NA   
3     0     1     0     1  7   
4     0     1     1     2  4.5 
5     1     0     0     2  4.5 
6     1     0     1     3  3.67
7     1     1     0     1  2   
8     1     1     1     0 NA   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...