R语言:如何按分组变量统计dataframe中唯一观测值的数量?
按年份统计唯一pnum数量的正确实现方法
我有一个约30万行、48列的DataFrame,仅关注其中的pnum和year两列,需要按year统计每个年份下唯一pnum的数量。
数据示例
dput(df) structure(list(pnum = c("1951bbn", "1951bbn", "1951bbn", "1951bbn", "1951bbn", "1951bbn", "1951bbn", "1951ggl", "1951ggl", "1951ggl", "1951ggl", "1951ggl", "1951ggl", "1951ggl", "1951ggl", "1952bbn", "1952bbn", "1952bbn", "1952bbn", "1952bbn", "1952bbn", "1952bbn", "1952bbn", "1952ggl", "1952ggl", "1952ggl", "1952ggl", "1952ggl", "1952ggl", "1952ggl", "1952ggl", "1952kkl", "1952kkl", "1952kkl", "1952kkl", "1952kkl", "1952kkl", "1952kkl", "1952kkl", "1952kkl", "1952llk", "1952llk", "1952llk", "1952llk", "1952llk", "1952llk", "1952llk", "1952llk", "1952llk", "1953hhj", "1953hhj", "1953hhj", "1953hhj", "1953hhj", "1953hhj", "1953hhj", "1953hhj", "1953hhj", "1953ggf", "1953ggf", "1953ggf", "1953ggf", "1953ggf", "1953ggf", "1953ggf", "1953ffl", "1953ffl", "1953ffl", "1953ffl", "1953ffl", "1953ffl", "1953ffl", "1953ffl"), year = c(1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1951L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1952L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L, 1953L)), class = "data.frame", row.names = c(NA, -73L))
之前的错误尝试
方法1:按year分组后count(pnum)
library(tidyverse) df %>% group_by(year) %>% count(pnum)
结果统计的是每个年份下各pnum的出现次数,不符合需求:
A tibble: 9 × 3 # Groups: year [3] year pnum n <int> <chr> <int> 1 1951 1951bbn 7 2 1951 1951ggl 8 3 1952 1952bbn 8 4 1952 1952ggl 8 5 1952 1952kkl 9 6 1952 1952llk 9 7 1953 1953ffl 8 8 1953 1953ggf 7 9 1953 1953hhj 9
方法2:错误使用n_distinct和count结合
df %>% group_by(year) %>% count(n_distinct(pnum))
结果也不符合预期:
# A tibble: 3 × 3 # Groups: year [3] year `n_distinct(pnum)` n <int> <int> <int> 1 1951 9 15 2 1952 9 34 3 1953 9 24
正确实现方法
方法1:使用dplyr的summarise + n_distinct
这是最直接的方式,按year分组后,用n_distinct()统计每组内唯一pnum的数量:
library(tidyverse) df %>% group_by(year) %>% summarise(n = n_distinct(pnum))
方法2:先去重再统计
先对year和pnum去重,再按year计数:
df %>% distinct(year, pnum) %>% count(year, name = "n")
方法3:Base R实现
无需加载tidyverse,用基础R的aggregate()函数:
aggregate(pnum ~ year, data = df, FUN = function(x) length(unique(x)))
期望输出
以上方法均可得到如下结果:
year n 1 1951 2 2 1952 4 3 1953 3
内容的提问来源于stack exchange,提问作者McMahok
相关产品推荐
相关产品推荐

