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

基于tidyverse计算多时间点认知测试项目得分变化

用tidyverse计算患者认知测试得分的时间变化差异

现有一项包含6个项目的认知测试,每个项目得分范围为0-10。5名患者在一天中的3个时间点(早晨、傍晚、夜间)完成了该测试,原始数据集的生成代码如下:

library(tidyverse)

set.seed(123) # 设置随机种子保证结果可复现
df <- tibble(
  id = rep(1:5, each = 3),
  time = rep(c("morning", "evening", "night"), each = 1, times = 5),
  i1 = round(runif(15, 0, 10)),
  i2 = round(runif(15, 0, 10)),
  i3 = round(runif(15, 0, 10)),
  i4 = round(runif(15, 0, 10)),
  i5 = round(runif(15, 0, 10)),
  i6 = round(runif(15, 0, 10))
)

需要采用tidyverse工具链,计算每位患者的得分时间变化,最终输出需保留原始数据列,同时新增差异列。以下分两种场景给出解决方案:


场景1:计算所有项目总分的时间差异

对应给出的期望输出格式,生成diff_morning_evening、diff_morning_night、diff_evening_night三个总分差异列:

# 1. 计算每个患者每个时间点的测试总分
df_with_total <- df %>%
  rowwise() %>%
  mutate(total = sum(c_across(starts_with("i")))) %>%
  ungroup()

# 2. 按患者ID分组,计算总分的时间差值
df_total_diff <- df_with_total %>%
  group_by(id) %>%
  summarise(
    # 差值计算逻辑:后一时间点得分 - 前一时间点得分,可按需调整顺序
    diff_morning_evening = total[time == "evening"] - total[time == "morning"],
    diff_morning_night = total[time == "night"] - total[time == "morning"],
    diff_evening_night = total[time == "night"] - total[time == "evening"],
    .groups = "drop"
  )

# 3. 合并原始数据与差异数据,得到最终结果
df_final <- df_with_total %>%
  left_join(df_total_diff, by = "id")

执行后,df_final将包含原始的所有列、新增的total总分列,以及三个时间差异列,与期望输出结构一致。


场景2:计算每个测试项目的时间差异

如果需要单独查看每个测试项目(i1-i6)在不同时间点的得分变化,可使用以下代码,生成每个项目对应的差异列(如i1_diff_morning_evening):

# 1. 将宽格式数据转为长格式,统一处理所有测试项目
df_long <- df %>%
  pivot_longer(cols = starts_with("i"), names_to = "item", values_to = "score")

# 2. 按患者ID和测试项目分组,计算各时间点的得分差值
df_item_diff <- df_long %>%
  group_by(id, item) %>%
  summarise(
    diff_morning_evening = score[time == "evening"] - score[time == "morning"],
    diff_morning_night = score[time == "night"] - score[time == "morning"],
    diff_evening_night = score[time == "night"] - score[time == "evening"],
    .groups = "drop"
  )

# 3. 将差异数据转回宽格式,匹配原始数据结构
df_diff_wide <- df_item_diff %>%
  pivot_wider(
    id_cols = id,
    names_from = item,
    names_glue = "{item}_{.value}",
    values_from = starts_with("diff")
  )

# 4. 合并原始数据与差异数据
df_final_item <- df %>%
  left_join(df_diff_wide, by = "id")

执行后,df_final_item将包含原始列,以及每个测试项目对应的三个时间差异列,适合对单个测试项目的时间变化做精细化分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:25:50