R语言按物种分组基于多字段匹配规则过滤数据框行的实现问题
正确实现代码
首先需加载dplyr依赖包:
library(dplyr)
两步过滤的完整管道代码如下:
result <- df %>% # 第一步:按species分组,过滤intro_region落在本组native_region取值范围内的行 group_by(species) %>% filter(!intro_region %in% native_region) %>% ungroup() %>% # 第二步:按species和intro_region分组,同时存在0和1时仅保留invasive为1的行 group_by(species, intro_region) %>% filter(if(all(c(0,1) %in% invasive)) invasive == 1 else TRUE) %>% ungroup()
逻辑说明
- 第一步过滤:原代码错误在于使用
all(native_region != intro_region)逐行比对两个列的对应位置值,而非判断当前行的intro_region是否属于本组全部native_region的取值集合,改为!intro_region %in% native_region即可得到9行的中间预期结果。 - 第二步过滤:原代码直接写死仅保留invasive为1的行,会把仅存在0的组的行也误删。通过
if-else分支判断:若当前组同时存在0和1的取值,仅保留invasive为1的行;否则保留组内所有行,即可得到7行的最终预期结果。
内容的提问来源于stack exchange,提问作者Kirsten Tyler
相关产品推荐
相关产品推荐

