有条件剔除案例:移除从未参与treatment B的animal.ID
R语言数据框筛选:保留从未参与treatment B的动物记录
注意:你提供的需求描述与期望结果存在偏差,需求描述写的是「剔除所有从未参与treatment B的animal.ID对应的行」,但期望结果实际是剔除参与过treatment B的动物ID对应的所有行,保留从未参与的。以下实现基于期望结果完成。
原数据
data <- structure(list(animal.ID = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3), treatment = c("A", "A", "B", "B", "C", "D", "A", "C", "A", "A","A", "C")), class = "data.frame", row.names = c(NA, -12L))
实现方法
方法1:Base R原生代码
先定位出参与过treatment B的动物ID,再筛选掉这些ID对应的所有行:
# 获取所有接受过treatment B的动物ID b_treated_ids <- unique(data$animal.ID[data$treatment == "B"]) # 筛选出未接受过B的动物记录 filtered_data <- data[!data$animal.ID %in% b_treated_ids, ]
方法2:dplyr包(tidyverse生态)
通过分组检查每个动物的治疗记录,直接过滤掉有过B治疗的组:
library(dplyr) filtered_data <- data %>% group_by(animal.ID) %>% filter(!any(treatment == "B")) %>% ungroup()
最终结果
运行上述任意代码后,得到的结果与你期望的一致:
filtered_data <- structure(list(animal.ID = c(2, 2, 2, 2, 3, 3, 3, 3), treatment = c("C", "D", "A", "C", "A", "A","A", "C")), class = "data.frame", row.names = c(NA, -8L))
内容的提问来源于stack exchange,提问作者kalex
相关产品推荐
相关产品推荐

