如何在R数据框中创建依赖Stage列范围值的NR_P列?
问题描述
现有如下R tibble数据框:
# A tibble: 795 × 8 Epoch `Ultra-slow` alpha beta delta gamma theta Stage <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> 1 8 384. 74.1 13.6 1926. 0.316 204. A 2 9 21.9 10.7 1.79 155. 0.0518 23.4 A 3 10 9.22 4.28 0.360 19.1 0.0138 3.22 A 4 11 2.89 5.02 0.792 31.5 0.0156 4.42 A 5 12 20.5 2.79 0.381 50.9 0.0159 4.15 A 6 13 5.49 6.70 0.395 19.7 0.0114 3.64 A 7 14 6.27 5.33 0.241 5.39 0.00406 4.12 A 8 15 5.23 4.70 0.275 7.25 0.00230 4.15 A 9 22 3.25 1.03 0.170 21.8 0.00172 5.01 2 10 23 3.57 1.93 0.240 14.7 0.00191 4.44 2 # ℹ 785 more rows
需新增一列NR_P:当该行处于NREM周期时取值为TRUE,否则为FALSE。NREM周期定义为:
- 连续时长≥30个Epoch的Stage 2、3或4阶段
- 且以Stage R或持续时长≥10个Epoch的清醒阶段A结束
解决方案
可以通过识别连续的Stage分段,结合分段的长度与后续终止分段的条件来实现,使用dplyr包即可完成:
- 加载依赖包
library(dplyr)
- 标记连续的Stage分段,并计算每个分段的关键属性
df_processed <- df %>% # 为连续相同的Stage分配唯一分段ID mutate(segment_id = consecutive_id(Stage)) %>% # 按分段ID计算每个分段的核心信息 mutate( stage_type = first(Stage), segment_length = n(), next_stage = lead(stage_type), next_segment_len = lead(segment_length), .by = segment_id )
- 判断每个分段是否符合NREM周期定义,生成
NR_P列
df_final <- df_processed %>% mutate( NR_P = case_when( # 满足NREM周期的所有条件:当前是2/3/4阶段、长度≥30,且后续是R或长时A stage_type %in% c("2", "3", "4") & segment_length >= 30 & (next_stage == "R" | (next_stage == "A" & next_segment_len >= 10)) ~ TRUE, # 其他所有情况标记为FALSE TRUE ~ FALSE ), .by = segment_id ) %>% # 移除中间辅助列(可选,按需保留) select(-segment_id, -stage_type, -segment_length, -next_stage, -next_segment_len)
关键说明
consecutive_id()函数自动为连续相同的Stage生成唯一ID,实现按分段分组计算lead()函数获取下一个分段的信息,用于验证当前分段的终止条件是否符合要求- 仅符合条件的NREM分段内的行被标记为
TRUE,终止段(R或长时A)不会被标记
内容的提问来源于stack exchange,提问作者lafinur
相关产品推荐
相关产品推荐

