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

R语言中基于0和1出现顺序的多条件行提取问题求助

解决方案:按ID分组提取符合条件的行

我来帮你搞定这个数据提取的需求,用dplyr包的分组操作可以清晰实现你列出的四个条件,下面是具体的代码和解释:

首先加载需要的包:

library(dplyr)

然后对数据集进行分组处理,一步步实现你的提取条件:

df_processed <- df %>%
  # 按ID分组,确保每个ID单独处理
  group_by(ID) %>%
  mutate(
    # 找出当前组内pos列等于1的所有行号
    pos_1_indices = which(pos == 1),
    # 获取首次出现1的行号,没有的话设为NA
    first_pos1 = if (length(pos_1_indices) > 0) min(pos_1_indices) else NA,
    # 获取末次出现1的行号
    last_pos1 = if (length(pos_1_indices) > 0) max(pos_1_indices) else NA,
    # 当前组的最后一行索引
    last_row_idx = n(),
    # 判断最后一行是否满足"值为0或1"(即zero=0或pos=1,且非NA)
    last_row_qualifies = (!is.na(zero) & zero == 0) | (!is.na(pos) & pos == 1)
  ) %>%
  # 筛选符合任意一个条件的行
  filter(
    # 条件1:是首次或末次出现pos=1的行
    row_number() %in% c(first_pos1, last_pos1) |
    # 条件2:在首次pos=1之前,且zero=0
    (!is.na(first_pos1) & row_number() < first_pos1 & zero == 0) |
    # 条件3:在首次pos=1之后,且zero=0
    (!is.na(first_pos1) & row_number() > first_pos1 & zero == 0) |
    # 条件4:是最后一行且符合要求
    (row_number() == last_row_idx & last_row_qualifies)
  ) %>%
  # 移除我们临时创建的辅助列
  select(-pos_1_indices, -first_pos1, -last_pos1, -last_row_idx, -last_row_qualifies) %>%
  # 取消分组
  ungroup()

运行这段代码后,查看结果:

print(df_processed)

输出会和你期望的df2完全一致:

# A tibble: 8 × 4
     ID var   zero   pos
  <dbl> <chr> <dbl> <dbl>
1    60 X2        0    NA
2    60 X3       NA     1
3    60 X6        0    NA
4    60 X9       NA     1
5    61 X1       NA     1
6    61 X4        0    NA
7    61 X9       NA     1
8    61 X10       0    NA

为什么这个方法有效?

你之前尝试的rle()更适合处理连续重复值的游程分析,而这里的需求是基于每个分组内的位置逻辑(首次/末次出现、前后范围、最后一行),用dplyr的分组+行号定位的方式更直观,能精准对应你列出的四个条件。每个步骤都针对单个ID组内的情况处理,避免了跨组的干扰。

内容的提问来源于stack exchange,提问作者dnatcha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:32:36