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

如何在R语言中筛选第二个Trial后的连续4行数据?

筛选第二个Trial后的连续4行数据

原始数据

ratings <- data.frame(Rating = c(0,99,99,99,99,99,99,99,0,99,99,99,99,99,99,99,99,99,99,99),
                      Trial = c(1,NA,NA,NA,NA,NA,NA,NA,2,NA,NA,NA,NA,NA,3,NA,NA,NA,NA,NA))

数据打印结果:

Rating Trial 
0        1      
99      NA      
99      NA      
99      NA      
99      NA   
99      NA   
99      NA      
99      NA      
0       2       
99      NA      
99      NA      
99      NA          
99      NA          
99      NA      
1       3       
99      NA      
99      NA      
99      NA    
99      NA    
99      NA   

需求

筛选出Trial=2所在行之后的连续4行,将这些行的var列标记为1,其余行标记为0。

尝试的代码(不符合需求)

ratings |> 
 mutate(var = ifelse(lag(Trial, n = 4L) == 2, 1, 0))

该代码仅标记了Trial=2之后第4行的位置,无法选中连续4行。

期望结果

Rating Trial var
0        1    0     
99      NA    0     
99      NA    0     
99      NA    0     
99      NA    0     
99      NA    0     
99      NA    0     
99      NA    0     
0       2     0     
99      NA    1     
99      NA    1     
99      NA    1         
99      NA    1         
99      NA    0     
1       3     0     
99      NA    0     
99      NA    0     
99      NA    0     
99      NA    0     
99      NA    0

解决方案

可以通过定位Trial=2的行号,再判断当前行是否处于该行号之后的连续4行范围内来实现:

library(dplyr)

ratings |>
  mutate(
    # 定位Trial=2的行号
    trial2_pos = which(Trial == 2),
    # 判断当前行是否在目标区间内,是则标记为1,否则0
    var = ifelse(row_number() %in% (trial2_pos + 1):(trial2_pos + 4), 1, 0)
  ) |>
  select(-trial2_pos)  # 移除临时辅助列

代码解释

  1. which(Trial == 2)找到Trial=2所在的行号;
  2. (trial2_pos + 1):(trial2_pos + 4)生成目标行的范围(即Trial=2之后的第1到第4行);
  3. row_number() %in% ...判断当前行是否在目标范围内,用ifelse生成var列;
  4. 最后用select(-trial2_pos)移除临时生成的辅助列,得到期望的结果。

也可以简化为一行代码:

ratings |>
  mutate(var = as.integer(row_number() %in% (which(Trial == 2) + 1):(which(Trial == 2) + 4)))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:39:21