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

求助:在R中对主受试者数据文件进行子集划分并生成逐次添加数据集

生成逐次添加受试者后的受试者池状态数据框

嘿,我明白你想要的是每次新增一位受试者后,实时记录下当前整个受试者池的状态对吧?基于你提供的模拟受试者数据代码,我给你两种实用的实现方案,你可以按需选择:

首先先把你的模拟数据代码整理好(确保能正常生成测试数据):

# 生成模拟受试者数据
N <- 30 # 总受试者数
data <- matrix(nrow = N, ncol = 4)
data[,1] <- 1:nrow(data)
for(i in 1:N){
  data[i,2] <- sample(0:1, 1) # 用0/1代表不同性别
  data[i,3] <- sample(18:80, 1) # 年龄范围18-80岁
  data[i,4] <- sample(18:30, 1) # BMI范围18-30
}
data <- as.data.frame(data)
colnames(data) <- c("id", "sex", "age", "bmi")

方案1:基础循环实现(易理解,适合新手)

这种方法用基础R就能实现,逻辑清晰,容易调试:

# 初始化空列表存储每一步的状态
subject_pool_status <- list()

# 遍历每一次添加受试者的步骤
for (i in 1:N) {
  # 提取当前已添加的前i位受试者数据
  current_group <- data[1:i, ]
  
  # 计算当前受试者池的核心状态指标
  total_num <- nrow(current_group)
  male_num <- sum(current_group$sex == 1)
  female_num <- sum(current_group$sex == 0)
  avg_age <- mean(current_group$age)
  avg_bmi <- mean(current_group$bmi)
  
  # 把指标整理成单行数据框,存入列表
  subject_pool_status[[i]] <- data.frame(
    step = i,
    total_subjects = total_num,
    male_count = male_num,
    female_count = female_num,
    average_age = round(avg_age, 2),
    average_bmi = round(avg_bmi, 2)
  )
}

# 将列表合并为最终的状态数据框
final_status_df <- do.call(rbind, subject_pool_status)

# 查看前5步的状态结果
head(final_status_df, 5)

方案2:用tidyverse工具简化代码(更优雅)

如果你平时用dplyr和purrr这类工具,这种写法会更简洁,少写很多冗余代码:

library(purrr)
library(dplyr)

final_status_df <- map_dfr(1:N, function(i) {
  data[1:i, ] %>%
    summarise(
      step = i,
      total_subjects = n(),
      male_count = sum(sex == 1),
      female_count = sum(sex == 0),
      average_age = round(mean(age), 2),
      average_bmi = round(mean(bmi), 2)
    )
})

# 查看最后3步的状态结果
tail(final_status_df, 3)

补充说明

两种方案生成的final_status_df数据框,每一行都对应添加第i位受试者后的受试者池整体状态。你可以根据自己的研究需求,随时调整要计算的指标——比如添加不同年龄组的占比、BMI区间的分布,或者其他你关心的维度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:04