基于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
相关产品推荐
相关产品推荐

