如何在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
相关产品推荐
相关产品推荐

