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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:42:36