如何在R中按分组删除indicator为FALSE的非最后行?
R按分组保留indicator=FALSE的最后行及所有indicator=TRUE行的实现
给定如下数据框df:
df <- structure(list(group = c("A", "A", "A", "A", "B", "B", "B"), indicator = c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE ), value = c(2, 1, 2, 4, 5, 1, 3)), class = "data.frame", row.names = c(NA, -7L))
需求是按group分组,删除每组中indicator == FALSE的非最后行,仅保留每组里最后一个FALSE行和所有TRUE行。
解法1:直接分组筛选
借助dplyr包的分组功能,通过条件直接定位目标行:
library(dplyr) result <- df %>% group_by(group) %>% # 筛选逻辑:要么是indicator=TRUE的行,要么是该组最后一个indicator=FALSE的行 filter(indicator | (row_number() == last(which(!indicator)))) %>% ungroup() print(result)
运行输出:
# A tibble: 4 × 3 group indicator value <chr> <lgl> <dbl> 1 A FALSE 2 2 A TRUE 4 3 B FALSE 1 4 B TRUE 3
解法2:标记序号后筛选
先给每组内的FALSE行标记组内序号,再筛选序号最大的FALSE行及所有TRUE行,逻辑更直观:
library(dplyr) result <- df %>% group_by(group) %>% # 给indicator=FALSE的行按组内顺序编号,TRUE行标记为NA mutate(false_row_num = if_else(!indicator, row_number()[!indicator], NA_integer_)) %>% # 筛选目标行:TRUE行 或 该组FALSE行中编号最大的行 filter(indicator | false_row_num == max(false_row_num, na.rm = TRUE)) %>% # 移除辅助计算列 select(-false_row_num) %>% ungroup() print(result)
输出结果与解法1完全一致。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

