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

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

代码解释

  1. DVNR列实现:

    • 先创建dv_flag标记DV>0的行(1表示是,0表示否)
    • 用cumsum(dv_flag)得到累计计数,仅在dv_flag=1时保留该计数,否则设为0
  2. OCC列实现:

    • 创建dose_flag标记给药行(AMT>0为1,否则0)
    • cumsum(dose_flag)会在每次给药时递增,cummax()确保后续非给药行继承当前的递增编号
    • 最后把给药行的OCC设为0,符合期望输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:15