如何在不同森林类型下识别组b相较于组a的差异树种?
我来帮你搞定这个需求!你要的是按每个森林类型(type),筛选出组b里那些组a完全没有的树种,这里有两种用dplyr实现的简洁方案,都能得到你预期的结果:
方法一:分组后直接筛选
利用dplyr的分组功能,在每个type组内直接判断b组的树种是否不在a组的树种集合里:
library(dplyr) dd %>% group_by(type) %>% # 筛选grp为b,且树种不在当前type下a组的树种列表中 filter(grp == "b" & !sp %in% sp[grp == "a"]) %>% # 去重避免重复记录 distinct(type, grp, sp)
运行后得到的结果正好是你想要的:
# A tibble: 3 × 3 # Groups: type [2] type grp sp <dbl> <chr> <chr> 1 1 b yew 2 2 b beech 3 2 b spruce
方法二:用anti_join做差集
先提取每个type下a组的唯一树种,再通过anti_join找出b组中不在这个集合里的记录,逻辑更直观:
# 先整理出每个type下a组的所有唯一树种 a_sp_list <- dd %>% filter(grp == "a") %>% distinct(type, sp) # 筛选b组的唯一树种,再剔除掉a组已有的部分 dd %>% filter(grp == "b") %>% distinct(type, grp, sp) %>% anti_join(a_sp_list, by = c("type", "sp"))
这个方法的输出和上面完全一致,anti_join本身就是专门用来找两个数据集的差异部分的,非常适合这类需求。
内容的提问来源于stack exchange,提问作者maycca
相关产品推荐
相关产品推荐

