如何在R中实现角色切换时计算BMI差值?
基于角色切换计算BMI差值
这里给你两种实现方式,分别用dplyr包和基础R来完成需求:
示例数据
df <- data.frame(role = c("Mother", "Mother", "Mother", "Mother", "Child", "Mother", "Mother", "Child"), bmi = c(22, 19, 21, 20, 17, 23, 22, 16))
方法1:用dplyr包(简洁高效)
library(dplyr) df_result <- df %>% # 标记当前行与前一行的role是否发生切换 mutate(role_switched = role != lag(role)) %>% # 仅在角色切换时计算前一行BMI减当前行BMI,其余行填充NA mutate(diff = ifelse(role_switched, lag(bmi) - bmi, NA)) %>% # 移除临时辅助列 select(-role_switched) print(df_result)
输出结果与需求完全匹配:
role bmi diff 1 Mother 22 NA 2 Mother 19 NA 3 Mother 21 NA 4 Mother 20 NA 5 Child 17 3 6 Mother 23 -6 7 Mother 22 NA 8 Child 16 6
方法2:基础R实现(无需额外包)
如果不想加载第三方包,用循环也能实现:
# 先初始化diff列为NA df$diff <- NA # 从第2行开始遍历,判断角色是否切换并计算差值 for(i in 2:nrow(df)){ if(df$role[i] != df$role[i-1]){ df$diff[i] <- df$bmi[i-1] - df$bmi[i] } } print(df)
核心逻辑说明
两种方法的思路一致:
- 识别相邻行的
role是否发生变化; - 仅在角色切换的行计算前一行与当前行的BMI差值,未切换的行保留
NA。
内容的提问来源于stack exchange,提问作者cliu
相关产品推荐
相关产品推荐

