R语言实现观测计数与分组观测场合标记的技术求助
解决R语言中新增DVNR和OCC列的数据处理需求
需求说明
为原始数据集新增两列:
- DVNR:每个
ID分组下,DV>0的累计计数(仅当DV>0时计数累加,给药行DV=0时该列值为0) - OCC:每次给药(
AMT>0)后的观测场合标记(给药行值为0,后续非给药行属于当前给药后的场合,直到下一次给药出现)
原始数据集
df_original <- matrix(c(1,15,0, 1,0,20, 1,0,12, 1,0,4, 1,15,0, 1,0,8, 1,20,0, 1,20,0, 1,0,18, 2,60,0, 2,0,40, 2,0,6, 2,10,0, 2,10,0, 2,0,5), ncol=3, byrow=T) colnames(df_original) <- c('ID', 'AMT', 'DV') rownames(df_original) <- c(1:15) df_original <- as.data.frame(df_original) # 转成数据框方便dplyr操作
期望输出数据集
df_wanted <- matrix(c(1,15,0,0,0, 1,0,20,1,1, 1,0,12,2,1, 1,0,4,3,1, 1,15,0,0,0, 1,0,8,4,2, 1,20,0,0,0, 1,20,0,0,0, 1,0,18,5,3, 2,60,0,0,0, 2,0,40,1,1, 2,0,6,2,1, 2,10,0,0,0, 2,10,0,0,0, 2,0,5,3,2), ncol=5, byrow=T) colnames(df_wanted) <- c('ID', 'AMT', 'DV', 'DVNR', 'OCC') rownames(df_wanted) <- c(1:15) df_wanted <- as.data.frame(df_wanted)
你的尝试代码(未成功)
df_Wanted <- df_Original %>% mutate(DVNR = ifelse(DV>0, 1, 0)) %>% group_by(ID) %>% mutate(DVNR2 = count(DVNR))
解决方案(使用dplyr)
核心思路是用cumsum()实现累计计数,用cummax()结合给药标记实现场合编号:
library(dplyr) df_result <- df_original %>% group_by(ID) %>% # 1. 生成DVNR列:仅DV>0时累加计数,否则为0 mutate( dv_flag = ifelse(DV > 0, 1, 0), DVNR = ifelse(dv_flag == 1, cumsum(dv_flag), 0) ) %>% # 2. 生成OCC列:标记给药后的场合 mutate( # 先标记给药行(AMT>0)为1,其他为0 dose_flag = ifelse(AMT > 0, 1, 0), # 累加给药标记得到场合组,再用cummax确保后续行继承当前场合编号,最后把给药行设为0 OCC = cummax(cumsum(dose_flag)), OCC = ifelse(dose_flag == 1, 0, OCC) ) %>% # 移除中间辅助列 select(-dv_flag, -dose_flag) %>% ungroup() # 查看结果 df_result
代码解释
DVNR列实现:
- 先创建
dv_flag标记DV>0的行(1表示是,0表示否) - 用
cumsum(dv_flag)得到累计计数,仅在dv_flag=1时保留该计数,否则设为0
- 先创建
OCC列实现:
- 创建
dose_flag标记给药行(AMT>0为1,否则0) cumsum(dose_flag)会在每次给药时递增,cummax()确保后续非给药行继承当前的递增编号- 最后把给药行的
OCC设为0,符合期望输出
- 创建
内容的提问来源于stack exchange,提问作者SFKR
相关产品推荐
相关产品推荐

