如何在R语言中按个体将参数值归一化至Day 0基准值?
嘿,这个按个体自身基线(Day0)归一化的需求太常见了!我给你分享两种在R里的实现方法,都能完美处理个体脱落的情况——毕竟脱落的个体只是少了后续天数的数据,完全不影响分组计算。
首先先把你的示例数据构建出来:
# 构造示例数据集 df <- data.frame( id = c("a", "b", "c", "a", "b", "c", "b", "c"), Day = c(0, 0, 0, 1, 1, 1, 2, 2), wt = c(10, 15, 12, 7.5, 10, 8, 5, 4), bp = c(100.00, 120.00, 150.00, 120.00, 150.00, 175.00, 110.00, 140) )
方法一:用dplyr(推荐,代码更易读)
tidyverse里的dplyr分组操作简直是为这种需求量身定做的,按id分组后,直接用每个个体的Day0值做分母就行:
library(dplyr) # 按个体归一化到自身Day0数值 normalized_df <- df %>% group_by(id) %>% mutate( # 体重归一化:当前值 / 自身Day0体重 wt_norm = wt / wt[Day == 0], # 血压归一化:当前值 / 自身Day0血压 bp_norm = bp / bp[Day == 0] ) %>% ungroup()
运行后你会得到带归一化列的结果,比如个体b的Day1体重是10,除以Day0的15,得到0.667,完全符合你的要求:
# A tibble: 8 × 6 id Day wt bp wt_norm bp_norm <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 1 a 0 10 100 1 1 2 b 0 15 120 1 1 3 c 0 12 150 1 1 4 a 1 7.5 120 0.75 1.2 5 b 1 10 150 0.667 1.25 6 c 1 8 175 0.667 1.17 7 b 2 5 110 0.333 0.917 8 c 2 4 140 0.333 0.933
方法二:用Base R(不用额外装包)
如果不想加载dplyr,用base R的ave函数也能实现,原理是按id分组后对每个变量应用自定义函数:
# Base R 实现归一化 df$wt_norm <- ave(df$wt, df$id, FUN = function(x) { # 提取当前组的Day0体重值 baseline <- x[df$Day[df$id == unique(df$id)] == 0] x / baseline }) df$bp_norm <- ave(df$bp, df$id, FUN = function(x) { baseline <- x[df$Day[df$id == unique(df$id)] == 0] x / baseline })
两种方法都能完美处理个体脱落的情况——比如示例里个体a没有Day2的数据,只会处理它存在的Day0和Day1行,完全不影响结果。
内容的提问来源于stack exchange,提问作者iayork
相关产品推荐
相关产品推荐

