You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:07:05