You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:25:53