如何在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) # 移除临时辅助列
代码解释
which(Trial == 2)找到Trial=2所在的行号;(trial2_pos + 1):(trial2_pos + 4)生成目标行的范围(即Trial=2之后的第1到第4行);row_number() %in% ...判断当前行是否在目标范围内,用ifelse生成var列;- 最后用
select(-trial2_pos)移除临时生成的辅助列,得到期望的结果。
也可以简化为一行代码:
ratings |> mutate(var = as.integer(row_number() %in% (which(Trial == 2) + 1):(which(Trial == 2) + 4)))
内容的提问来源于stack exchange,提问作者Yaaman
相关产品推荐
相关产品推荐

