Я хочу подсчитать количество независимых наблюдений на группу в группе с повторными измерениями.
Вот некоторые игровые данные
library(dplyr)
df <- bind_rows(mtcars, mtcars, mtcars) %>%
mutate(id=rep(row.names(mtcars),3))
В этих данных
df %>% group_by(cyl, id) %>% count()
показывает
# A tibble: 32 x 3
# Groups: cyl, id [32]
cyl id n
<dbl> <chr> <int>
1 4 Datsun 710 3
2 4 Fiat 128 3
3 4 Fiat X1-9 3
4 4 Honda Civic 3
5 4 Lotus Europa 3
6 4 Merc 230 3
7 4 Merc 240D 3
8 4 Porsche 914-2 3
9 4 Toyota Corolla 3
10 4 Toyota Corona 3
# … with 22 more rows
Это количество наблюдений на человека (то есть на каждую машину). Чтобы получить количество независимых наблюдений на группу (сколько автомобилей для каждой cyl
), я мог бы сделать это следующим образом.
df %>% group_by(cyl,id) %>% count() %>% ungroup() %>% group_by(cyl) %>% count()
# A tibble: 3 x 2
# Groups: cyl [3]
cyl n
<dbl> <int>
1 4 11
2 6 7
3 8 14
который дает правильный результат (проверьте mtcars %>% group_by(cyl) %>% count()
)
group_by(...) %>% count() %>% ungroup() %>% group_by() %>% count()
мне не интуитивно понятно.
Что мне не хватает? Есть лучший способ сделать это?
Смежный вопрос: есть ли способ передать счет в исходный df или вам нужен новый объект и left_join(...)
?
Вам нужно n_distinct()
-
df %>% group_by(cyl) %>% summarize(n = n_distinct(id))
# A tibble: 3 x 2
cyl n
<dbl> <int>
1 4 11
2 6 7
3 8 14
Для вашего связанного вопроса вы можете сделать -
df %>%
group_by(cyl) %>%
mutate(n = n_distinct(id)) %>%
ungroup()
Потрясающе, поведение n_distinct()
похоже на то, что мы ожидаем от unique(df$id)
, но вложенное в группу благодаря group_by()
.
да, вы можете думать об этом как length(unique(df$id))
внутри каждой группы.
Немного короче, чем ваш подход был бы
df %>% count(cyl,id) %>% count(cyl)