Предположим, у меня есть следующий фрейм данных (обратите внимание на длину 'показателя'):
id = 1:10^8
school = LETTERS[1:10]
class = paste0(school, rep(1:10, each=10))
score = rnorm(10^8)
df = data.frame(id, school, class, score,
stringsAsFactors = FALSE)
Я хочу вычислить среднее значение для каждого из 100 классов. Еще я тоже хочу
сохранить переменную школы в результатах. Использование dplyr:
df %>% group_by(class) %>%
summarise(mean = mean(score),
school = unique(school))
Это работает, но медленно (8 секунд на моей машине, и мои данные на самом деле намного больше). Я думаю, что одним из вариантов может быть не использование unique (), а член семьи join (). Но мне нужно сначала определить другой df следующим образом:
df_join = data.frame(class, school,
stringsAsFactors = FALSE)
, а затем:
df %>% group_by(class) %>%
summarise(mean = mean(score)) %>%
left_join(df_join)
Это работает и менее медленно, так как теперь это занимает 6 секунд. Тем не менее, создать здесь df_join было легко, потому что я изобрел кадр данных, но в реальной жизни получение df_join может быть намного сложнее. Поэтому я хотел бы использовать только исходный фрейм данных (df).
Есть идеи, как сделать это проще (и, возможно, быстрее) с помощью dplyr? (Я там проверял, но не нашел решения: Агрегирование по уровням факторов, сохранение других переменных в результирующем фрейме данных )