如何基于每个ID的首尾OCC值生成OCC1标记列?
使用dplyr标记分组内首尾给药次数(OCC)
我们有一个纵向结构的DataFrame,每个ID对应多条观测数据,OCC列标记了给药次数。需要新增OCC1列,规则为:
- 每个
ID对应的首次OCC所有行标记为1 - 每个
ID对应的末次OCC所有行标记为2 - 其余中间OCC的所有行标记为0
输入示例数据
ID TIME ADMIN CONC OCC 1 0 10 0 1 1 1 0 1000 1 1 8 0 560 1 1 12 0 203 1 1 24 10 56 2 1 32 0 674 2 1 36 0 457 2 2 0 20 0 1 2 12 0 144 1 2 24 20 32 2 2 36 0 97 2 2 48 20 199 3 2 60 0 120 3
期望输出数据
ID TIME ADMIN CONC OCC OCC1 1 0 10 0 1 1 1 1 0 1000 1 1 1 8 0 560 1 1 1 12 0 203 1 1 1 24 10 56 2 2 1 32 0 674 2 2 1 36 0 457 2 2 2 0 20 0 1 1 2 12 0 144 1 1 2 24 20 32 2 0 2 36 0 97 2 0 2 48 20 199 3 2 2 60 0 120 3 2
解决方案
使用dplyr的分组功能结合多条件判断,一次性完成标记:
library(dplyr) # 假设你的数据框名为df df <- df %>% group_by(ID) %>% mutate( OCC1 = case_when( OCC == first(OCC) ~ 1, OCC == last(OCC) ~ 2, TRUE ~ 0 ) ) %>% ungroup() # 可选:取消分组,避免后续操作受分组影响
代码说明
group_by(ID):按ID分组,确保每个ID的标记逻辑独立执行first(OCC)/last(OCC):分别提取当前分组中OCC的首次、末次取值case_when():按顺序匹配条件,满足对应规则则赋值,最后用TRUE ~ 0覆盖所有中间OCC的情况
运行上述代码后,即可得到符合要求的OCC1列。
内容的提问来源于stack exchange,提问作者asher
相关产品推荐
相关产品推荐

