如何基于组内行筛选移除tibble中的整个对象组?
按组过滤tibble:保留符合组件数量要求的对象行
需求场景
现有一个tibble,每行对应某一对象的一个组件,同一对象会有多行记录。需要仅保留恰好包含1个component为"x"的对象的所有行,不符合条件的对象需整组移除。
示例数据:
library(tibble) tib <- tibble(object = c("a", "a", "a", "a", "b", "b", "b"), component = c("x", "x", "y", "z", "x", "y", "y"), data = 1:7)
上述数据中,对象"a"包含2个"x"组件,不符合要求需移除全部4行;对象"b"符合要求,保留全部3行。
错误代码分析
你尝试的代码存在两个问题:
group_by("object")中多了引号,应该直接引用列名object- 用
count(cur_data(), component)的方式在filter中统计组内数据过于复杂且用法错误
错误代码:
tib %>% group_by("object") %>% filter(count(cur_data(), component)$b != 1)
正确实现方法
方法一:组内直接统计过滤(最简洁)
利用dplyr的分组特性,在组内统计component为"x"的行数,仅保留数量等于1的组:
library(dplyr) tib %>% group_by(object) %>% filter(sum(component == "x") == 1) %>% ungroup() # 可选,根据后续操作需求决定是否取消分组
方法二:先统计再关联过滤(适合复杂条件)
先单独统计每个对象的"x"组件数量,再用结果过滤原数据:
# 第一步:统计符合条件的对象 valid_objects <- tib %>% group_by(object) %>% summarise(x_count = sum(component == "x")) %>% filter(x_count == 1) %>% pull(object) # 提取符合条件的对象名称向量 # 第二步:过滤原数据 tib %>% filter(object %in% valid_objects)
方法三:用add_count简化统计
add_count可以直接给每行添加对应对象的"x"组件数量,再过滤:
tib %>% add_count(object, wt = (component == "x"), name = "x_count") %>% filter(x_count == 1) %>% select(-x_count) # 可选,移除临时生成的统计列
内容的提问来源于stack exchange,提问作者3luke33
相关产品推荐
相关产品推荐

