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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:07:50