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

如何在R语言中按ID统计gens列唯一值数量并新增结果列

问题:按ID统计gens列唯一非NA值数量并新增列

原始数据

table=data.frame(ID=c("A", "A", "A", "A", "A", "A", "A", "B", "B", "C", "C", "C", "D", "D"),
                 obj=c("fu", "sp", "sp", "sp", "sp", "sp", "sp", "fu", "sp", "fu", "sp", "sp", "fu", "sp"),
                 gens=c(NA, NA, "AZJE", NA, "JAUE", NA, "AZJE", NA, NA, NA, "AUEJ", NA, NA, "EUF"))

打印结果:

ID obj gens
1   A  fu <NA>
2   A  sp <NA>
3   A  sp AZJE
4   A  sp <NA>
5   A  sp JAUE
6   A  sp <NA>
7   A  sp AZJE
8   B  fu <NA>
9   B  sp <NA>
10  C  fu <NA>
11  C  sp AUEJ
12  C  sp <NA>
13  D  fu <NA>
14  D  sp  EUF

期望输出

希望新增res列,统计每个ID对应的gens列唯一值数量,输出如下:

> output
   ID obj gens res
1   A  fu <NA>   2
2   A  sp <NA>   2
3   A  sp AZJE   2
4   A  sp <NA>   2
5   A  sp JAUE   2
6   A  sp <NA>   2
7   A  sp AZJE   2
8   B  fu <NA>   0
9   B  sp <NA>   0
10  C  fu <NA>   1
11  C  sp AUEJ   1
12  C  sp <NA>   1
13  D  fu <NA>   1
14  D  sp  EUF   1

当前尝试的代码及结果

目前能统计每个ID的非NA值数量,但无法统计唯一值数量,代码如下:

table_test = table %>% 
  group_by(ID)  %>%
  mutate(res = sum(obj=="sp" & !is.na(gens )))

输出结果:

# A tibble: 14 × 4
# Groups:   ID [4]
   ID    obj   gens    res
   <chr> <chr> <chr> <int>
 1 A     fu    NA        3
 2 A     sp    NA        3
 3 A     sp    AZJE      3
 4 A     sp    NA        3
 5 A     sp    JAUE      3
 6 A     sp    NA        3
 7 A     sp    AZJE      3
 8 B     fu    NA        0
 9 B     sp    NA        0
10 C     fu    NA        1
11 C     sp    AUEJ      1
12 C     sp    NA        1
13 D     fu    NA        1
14 D     sp    EUF       1

解决方案

使用dplyr包中的n_distinct()函数,该函数可以直接统计向量中的唯一值数量,配合na.rm = TRUE参数忽略NA值,即可实现需求:

table_output = table %>% 
  group_by(ID) %>%
  mutate(res = n_distinct(gens, na.rm = TRUE))

运行后得到的输出与期望一致:

# A tibble: 14 × 4
# Groups:   ID [4]
   ID    obj   gens    res
   <chr> <chr> <chr> <int>
 1 A     fu    NA        2
 2 A     sp    NA        2
 3 A     sp    AZJE      2
 4 A     sp    NA        2
 5 A     sp    JAUE      2
 6 A     sp    NA        2
 7 A     sp    AZJE      2
 8 B     fu    NA        0
 9 B     sp    NA        0
10 C     fu    NA        1
11 C     sp    AUEJ      1
12 C     sp    NA        1
13 D     fu    NA        1
14 D     sp    EUF       1

说明

  • n_distinct(gens, na.rm = TRUE)会对每个ID分组内的gens列进行处理,统计其中非NA的唯一值数量;
  • 该函数自动去重,正好解决之前统计重复非NA值的问题。

内容的提问来源于stack exchange,提问作者Av65

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:53:14