按分组计算占比:R语言多站点物种比例高效计算求助
简洁计算各站点物种占比的R方案
嘿,作为R语言新手,你已经尝试了拆分数据框的方法,但确实可以用更简洁的方式实现——不用创建一堆中间对象,用dplyr的链式操作或者Base R的函数就能一步搞定!
首先先把你的原始数据明确下来(方便复现):
df <- data.frame( Site = c("A", "A", "A", "A", "B", "B", "B"), Species = c("Davilla kunthii", "Faramea occidentalis", "Thevetia ahouai", "Desmodium axillare", "Mimosa sp.", "Sida rhombifolia", "Sida rhombifolia") )
推荐方案:用dplyr链式操作(最直观)
dplyr的管道语法(%>%)可以让你把所有操作串起来,全程不用额外创建临时对象:
library(dplyr) output <- df %>% # 第一步:按站点+物种分组,统计每个组合的出现次数 group_by(Site, Species) %>% tally() %>% # 第二步:回到按站点分组,计算每个物种在站点内的占比 group_by(Site) %>% mutate(Proportion = round(n / sum(n), 4)) %>% # 可选:删掉计数列n,只保留你需要的三列 select(-n) # 查看结果 output
运行后会得到你想要的输出:
# A tibble: 6 × 3 # Groups: Site [2] Site Species Proportion <chr> <chr> <dbl> 1 A Davilla kunthii 0.25 2 A Desmodium axillare 0.25 3 A Faramea occidentalis 0.25 4 A Thevetia ahouai 0.25 5 B Mimosa sp. 0.3333 6 B Sida rhombifolia 0.6667
每一步的逻辑:
group_by(Site, Species):把数据按站点和物种分组,这样tally()能统计每个站点下每个物种的个体数;- 再次
group_by(Site):切换分组维度到站点,确保计算占比时是用物种计数除以当前站点的总个体数; mutate(Proportion = round(n / sum(n), 4)):生成占比列,用round()控制小数位数(和你期望的输出一致)。
备选方案:Base R实现(不用额外装包)
如果不想安装dplyr,用Base R的ave()函数也能做到:
# 直接在原数据框添加占比列 df$Proportion <- with(df, # 每个站点-物种的数量 / 每个站点的总数量 ave(rep(1, nrow(df)), Site, Species, FUN = length) / ave(rep(1, nrow(df)), Site, FUN = length) ) # 去重得到唯一的站点-物种-占比行 output_base <- unique(df)
这个方法的核心是ave()函数,它能按分组计算统计量,最后用unique()去掉重复行,就能得到和目标一致的结果。
内容的提问来源于stack exchange,提问作者Paulina Corona Tejeda
相关产品推荐
相关产品推荐

