如何按受试者分组提取首次检查年龄(最小值)并生成新列?
为受试者随访数据集添加首次检查年龄列
我正在处理一份包含受试者随访检查数据的数据集,记录了每次检查时的年龄:
subject <- c("subject1", "subject1", "subject2", "subject2", "subject2", "subject3", "subject3") ageAtExam <- c(50, 51, 30, 32, 35, 40, 45) df <- data.frame(subject, ageAtExam) # 原始数据集输出 > df subject ageAtExam 1 subject1 50 2 subject1 51 3 subject2 30 4 subject2 32 5 subject2 35 6 subject3 40 7 subject3 45
需求:新增一列ageAtFirstExam,填入每位受试者首次检查时的年龄(即每个subject对应的ageAtExam最小值),预期结果如下:
subject ageAtExam ageAtFirstExam 1 subject1 50 50 2 subject1 51 50 3 subject2 30 30 4 subject2 32 30 5 subject2 35 30 6 subject3 40 40 7 subject3 45 40
以下是几种可行的解决方案:
方法1:Base R(无需额外包)
使用ave()函数按受试者分组计算最小值,并将结果映射到每一行:
df$ageAtFirstExam <- ave(df$ageAtExam, df$subject, FUN = min)
方法2:dplyr(tidyverse生态)
通过分组后添加新列的方式实现,适合习惯tidy语法的用户:
library(dplyr) df <- df %>% group_by(subject) %>% mutate(ageAtFirstExam = min(ageAtExam)) %>% ungroup() # 取消分组,避免后续操作受分组影响
方法3:data.table(适合大数据集)
data.table的语法更高效,处理大规模数据时性能更优:
library(data.table) setDT(df)[, ageAtFirstExam := min(ageAtExam), by = subject]
执行任意一种方法后,查看df即可得到预期的结果。
内容的提问来源于stack exchange,提问作者Nereus
相关产品推荐
相关产品推荐

