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

在R语言中按SUBJECT-TIME分组添加编号列ADDTHIS

自动生成ADDTHIS分组编号的解决方案

需求说明

替代手动赋值方式自动生成ADDTHIS列,规则如下:

  • 同一SUBJECT下,按TIME的先后顺序分配主编号(如1、2、3…)
  • 同一SUBJECT-TIME分组内,若有多个事件,在主编号后追加.1、.2…子编号;若只有单个事件,直接使用主编号
  • 切换SUBJECT或SUBJECT-TIME分组时,编号规则重置

修改后的代码

library(dplyr)
library(tidyr)

df <- data.frame(
  SUBJECT = c(1, 2, 3, 3),
  TIME = c(7, 9, 4, 5),
  A = c(1, 0, 1, 0),
  B = c(NA, 1, 1, 1),
  C = c(1, 0, 0, 0)
)

df_long <- df %>%
  pivot_longer(cols = A:C, names_to = "EVENT", values_to = "value") %>%
  filter(!is.na(value) & value == 1) %>%
  select(-value) %>%
  # 为每个SUBJECT下的TIME分配主编号(按TIME数值排序)
  group_by(SUBJECT) %>%
  mutate(time_seq = dense_rank(TIME)) %>%
  # 按SUBJECT-TIME分组,生成组内事件子编号
  group_by(SUBJECT, TIME) %>%
  mutate(
    event_seq = row_number(),
    ADDTHIS = if_else(
      n() == 1,
      as.character(time_seq),
      paste(time_seq, event_seq, sep = ".")
    )
  ) %>%
  ungroup() %>%
  # 移除辅助列(可选操作)
  select(-time_seq, -event_seq)

运行结果

# A tibble: 6 × 4
  SUBJECT  TIME EVENT ADDTHIS
    <dbl> <dbl> <chr> <chr>  
1       1     7 A     1.1    
2       1     7 C     1.2    
3       2     9 B     1      
4       3     4 A     1.1    
5       3     4 B     1.2    
6       3     5 B     2      

代码逻辑说明

  1. 转长表与筛选:通过pivot_longer将宽表转为事件长表,筛选出值为1且非NA的有效事件
  2. 生成主编号:按SUBJECT分组,用dense_rank(TIME)为每个时间点分配递增主编号,保证同一受试者内时间顺序正确
  3. 生成子编号与拼接:按SUBJECT-TIME分组,用row_number()生成组内事件序号;根据组内事件数量决定编号格式,单个事件直接用主编号,多个事件则拼接主编号与子编号
  4. 清理数据:取消分组并移除中间辅助列,得到最终结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:57:05