在R中计算多组间仅属于单组的唯一字符串数量
解决每个分组特有物种计数的问题
我懂你要的是什么——只属于当前plot、从未在其他分组出现过的独特spp数量。你的原代码只是统计了每个组内的物种种类数,没考虑跨组的唯一性,所以结果和预期不符。下面是具体的解决方法:
方法思路
要实现需求,我们需要两步核心逻辑:
- 第一步:先统计每个
spp总共出现在多少个不同的plot里 - 第二步:筛选出那些仅在1个
plot里出现的物种,再按plot分组统计数量
完整代码实现
用dplyr可以很简洁地完成这个逻辑,链式写法如下:
library(dplyr) # 你的原始数据集 db <- data.frame(plot = c('a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c'), spp = c('sp1', 'sp1', 'sp2', 'sp1', 'sp3', 'sp1', 'sp1', 'sp2', 'sp4', 'sp4', 'sp1', 'sp2', 'sp5', 'sp6', 'sp7')) # 计算每个plot的特有物种数量 db_unique_spp <- db %>% # 给每个物种标记它出现过的plot总数 group_by(spp) %>% mutate(plot_occurrences = n_distinct(plot)) %>% ungroup() %>% # 只保留仅在一个plot出现的物种记录 filter(plot_occurrences == 1) %>% # 按plot分组,统计特有物种数量 group_by(plot) %>% summarise(unique_to_plot = n_distinct(spp)) # 查看结果 db_unique_spp
运行结果
执行后会得到你期望的输出:
# A tibble: 3 × 2 plot unique_to_plot <chr> <int> 1 a 1 2 b 1 3 c 3
为什么原代码不对?
你的原代码:
db_sum <- db %>% group_by(plot) %>% summarise(n_unique = n_distinct(across(spp)))
这段代码的逻辑是统计每个plot内有多少种不同的物种,完全不关心这些物种是否在其他plot出现过,所以得到的是每个组的物种丰富度,而非特有物种数。
内容的提问来源于stack exchange,提问作者hiperhiper
相关产品推荐
相关产品推荐

