在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
代码逻辑说明
- 转长表与筛选:通过
pivot_longer将宽表转为事件长表,筛选出值为1且非NA的有效事件 - 生成主编号:按
SUBJECT分组,用dense_rank(TIME)为每个时间点分配递增主编号,保证同一受试者内时间顺序正确 - 生成子编号与拼接:按
SUBJECT-TIME分组,用row_number()生成组内事件序号;根据组内事件数量决定编号格式,单个事件直接用主编号,多个事件则拼接主编号与子编号 - 清理数据:取消分组并移除中间辅助列,得到最终结果
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

