在R中按ID基于连续行血压阈值条件生成二元变量GH
在R语言中按ID标记连续高血压序列的二元变量GH
我们需要为数据框中的每个ID创建二元变量GH,规则为:若某行属于**连续两行及以上满足BP1 >= 140或BP2 >= 90**的序列,则GH为1,否则为0。原始数据如下:
ID <- c(1, 1, 1, 1, 2, 2, 2) BP1 <- c(130, 140, 140, 130, 110, 120, 130) BP2 <- c(80, 90, 80, 110, 90, 80, 90) DF1 <- data.frame(ID, BP1, BP2)
方法1:使用dplyr(tidyverse生态)
通过分组标记连续序列,再判断序列长度是否符合要求:
library(dplyr) DF2 <- DF1 %>% # 按ID分组处理 group_by(ID) %>% # 第一步:标记当前行是否满足高血压条件 mutate(is_high = BP1 >= 140 | BP2 >= 90) %>% # 第二步:为连续的相同is_high值创建分组ID mutate(group_id = consecutive_id(is_high)) %>% # 按ID+连续分组ID再次分组,判断是否符合GH=1的条件 group_by(ID, group_id) %>% mutate(GH = ifelse(is_high & n() >= 2, 1, 0)) %>% # 取消分组,清理临时变量 ungroup() %>% select(-is_high, -group_id) # 查看结果 print(DF2)
方法2:使用data.table(高效处理大数据)
利用rleid函数快速标记连续序列,逻辑和dplyr一致:
library(data.table) # 转换为data.table格式 setDT(DF1) DF2 <- DF1[, .(BP1, BP2, is_high = BP1 >= 140 | BP2 >= 90), by = ID] %>% # 按ID分组,标记连续的is_high序列 .[, group_id := rleid(is_high), by = ID] %>% # 按ID+group_id分组,计算GH值 .[, GH := ifelse(is_high & .N >= 2, 1, 0), by = .(ID, group_id)] %>% # 保留需要的列 .[, .(ID, BP1, BP2, GH)] # 查看结果 print(DF2)
结果说明
运行上述代码后,得到的DF2如下:
# A tibble: 7 × 4 ID BP1 BP2 GH <dbl> <dbl> <dbl> <dbl> 1 1 130 80 0 2 1 140 90 1 3 1 140 80 1 4 1 130 110 1 5 2 110 90 0 6 2 120 80 0 7 2 130 90 0
- ID1的第2-4行属于连续3个满足条件的序列,因此GH=1;
- ID2的满足条件行都是单独出现,没有连续两行及以上,因此GH全为0。
内容的提问来源于stack exchange,提问作者19056530
相关产品推荐
相关产品推荐

