Вычислительная группа означает для категорий без наблюдений в dplyr и data.table - PullRequest
1 голос
/ 04 мая 2020

У меня есть набор данных с числовой переменной c и групповой переменной, и я хотел бы вычислить групповое среднее. Некоторые группы пусты, то есть есть некоторые уровни факторов, которые не отображаются в данных. При вычислении сгруппированных средних я бы хотел, чтобы эти пустые группы были указаны рядом с непустыми группами. Этого легко добиться, используя базу R:

# Create an example of a data frame where variable1 is numeric and variable2 is a
# factor with three levels, two of which appear in the data:
df <- data.frame(variable1 = c(1,2,3,4), variable2 = factor(c("A","B","A","B")))
levels(df$variable2) <- c(levels(df$variable2), "C")

# Base R
tapply(df$variable1, df$variable2, mean)

, которая отображает вывод

A  B  C 
2  3 NA 

, что я и ищу.

Однако для различных причины, по которым я должен сделать это, используя вместо этого dplyr или data.table. Проблема в том, что оба пропускают пустые уровни в сводках:

library(dplyr)
df %>% group_by(variable2) %>%
  summarise(var1Mean = mean(variable1))

приводит к

# A tibble: 2 x 2
  variable2 var1Mean
  <fct>        <dbl>
1 A                2
2 B                3

И

library(data.table)
df <- as.data.table(df)
df[, mean(variable1), variable2]

приводит к

   variable2 V1
1:         A  2
2:         B  3

Есть ли способ сделать так, чтобы любой из этих пакетов включал пустые группы в сводку?

Ответы [ 2 ]

4 голосов
/ 04 мая 2020

Вы можете указать .drop = FALSE в group_by для хранения пустых групп.

library(dplyr)

df %>%  
 group_by(variable2, .drop = FALSE) %>% 
 summarise(var1Mean = mean(variable1))

# A tibble: 3 x 2
#  variable2 var1Mean
#  <fct>        <dbl>
#1 A                2
#2 B                3
#3 C              NaN
3 голосов
/ 04 мая 2020

Вы можете сделать это в data.table

df[.(variable2 = levels(variable2)), on = 'variable2',
   mean(variable1), by = variable2]
#    variable2 V1
# 1:         A  2
# 2:         B  3
# 3:      <NA> NA

Чуть чище, если df набран variable2:

setkey(df, variable2)
df[.(levels(variable2)), mean(variable1), by = variable2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...