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

如何在DataFrame中基于其他列值创建新列:生成受试者首次治疗年份(未治疗则设为0)

解决方案:生成每位受试者的首次治疗年份列

针对你的需求,这里提供两种通用的R语言实现方法,无论数据集规模多大都能轻松适配:

方法一:使用dplyr(tidyverse工具包)

这是最直观易读的分组数据处理方案,推荐日常使用:

首先确保你已安装并加载dplyr包:

install.packages("dplyr")
library(dplyr)

然后运行以下代码生成first_treat列(顺便修正了原示例中subject向量未加引号的语法问题):

subject <- c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C")
year <- c(2000, 2001, 2002, 2003, 2004, 2000, 2001, 2002, 2003, 2004, 2000, 2001, 2002, 2003, 2004)
treat <- c(0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0)
df1 <- data.frame(subject, year, treat)

# 核心代码:分组计算首次治疗年份
df1 <- df1 %>%
  group_by(subject) %>%
  mutate(first_treat = ifelse(any(treat == 1), min(year[treat == 1]), 0)) %>%
  ungroup()

逻辑说明

  • 按subject分组后,先检查该组是否存在治疗记录(any(treat == 1))
  • 若存在,提取所有治疗年份中的最小值(即首次治疗年份);若不存在,直接设为0
  • 最后用ungroup()取消分组,避免影响后续数据操作

方法二:使用Base R(无需额外安装包)

如果你偏好原生R语法,不想加载第三方包,可以用ave()函数实现分组计算:

# 先构建修正后的示例数据
subject <- c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C")
year <- c(2000, 2001, 2002, 2003, 2004, 2000, 2001, 2002, 2003, 2004, 2000, 2001, 2002, 2003, 2004)
treat <- c(0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0)
df1 <- data.frame(subject, year, treat)

# 简洁版核心代码
df1$first_treat <- ave(df1$year * df1$treat, df1$subject, FUN = function(x) {
  if(sum(x) > 0) min(x[x > 0]) else 0
})

逻辑说明

  • ave()按subject分组,对year*treat的结果进行计算(未治疗的年份会被转为0)
  • 如果分组内有非0值(即存在治疗记录),取最小的非0值;否则设为0

两种方法运行后,都能得到你期望的first_treat列结果。

内容的提问来源于stack exchange,提问作者marc roca llevadot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:32:42