如何用dplyr::filter()筛选符合语言变化规则的DataFrame行?
解决方案
要实现需求,核心是先按ID分组做整体条件校验,再筛选符合条件的ID对应的所有行——因为我们要保留的是整个ID的全部行,而非单个满足条件的行。
代码实现
library(dplyr) # 加载示例数据 DATA <- read.table(header=TRUE,text=" ID Type Year Language 1 1A 1718 spanish 1 1A 1819 spanish 1 5F 1920 English 2 1B 1718 spanish 2 1B 1819 spanish 2 1B 1920 spanish 2 5F 2021 spanish 3 1B 1920 English 3 5F 2021 English") # 筛选符合条件的ID的所有行 filtered_data <- DATA %>% group_by(ID) %>% filter( # 所有非5F类型的行,Language都不是英语 all(Language != "English" & Type != "5F") & # 若存在5F类型的行,这些行的Language必须是English all(ifelse(Type == "5F", Language == "English", TRUE)) ) %>% ungroup() # 查看结果 filtered_data
代码说明
group_by(ID):按ID分组,确保我们对每个ID的所有行做统一校验- 第一个条件
all(Language != "English" & Type != "5F"):校验该ID下所有非5F类型的行,语言均不为英语 - 第二个条件
all(ifelse(Type == "5F", Language == "English", TRUE)):仅对5F类型的行校验语言是否为英语,非5F行不参与此分支判断 ungroup():取消分组,恢复常规数据框格式
运行结果
执行后得到的结果与你提供的Desired_output完全一致:
# A tibble: 3 × 4 ID Type Year Language <int> <chr> <int> <chr> 1 1 1A 1718 spanish 2 1 1A 1819 spanish 3 1 5F 1920 English
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

