在dplyr中为分组数据框实现变量(年龄)递增的方法
解决方案
你可以通过按student分组,定位每个学生首次出现的非NA年龄,再根据行号计算后续年龄的方式实现需求。以下是基于dplyr的代码:
library(dplyr) # 原始数据框 df <- data.frame( student = c("A", "A", "A","B","B", "B", "C", "C","C"), grade = c(1, 2, 3, 1, 2, 3, 1, 2, 3), age= c(NA, 6, 6, 7, 7, 7, NA, NA, 9) ) # 更新年龄 updated_df <- df %>% group_by(student) %>% mutate( # 获取当前学生第一个非NA的年龄值 base_age = first(age[!is.na(age)]), # 获取当前学生第一个非NA年龄所在的行位置 base_pos = which(!is.na(age))[1], # 根据规则计算更新后的年龄 updated_age = case_when( row_number() < base_pos ~ age, # 首个非NA年龄之前的行保留原NA row_number() == base_pos ~ base_age, # 首个非NA年龄的行保持原值 TRUE ~ base_age + (row_number() - base_pos) # 后续行按前一年年龄加1计算 ) ) %>% ungroup() %>% select(-base_age, -base_pos) # 移除中间辅助列 print(updated_df)
输出结果
student grade age updated_age 1 A 1 NA NA 2 A 2 6 6 3 A 3 6 7 4 B 1 7 7 5 B 2 7 8 6 B 3 7 9 7 C 1 NA NA 8 C 2 NA NA 9 C 3 9 9
逻辑说明
- 分组处理:按
student分组,确保每个学生的年龄计算独立进行。 - 定位基准值:找到每个学生第一个非NA的年龄(
base_age)及其所在行(base_pos)。 - 计算更新年龄:
- 首个非NA年龄之前的行,保留原始的NA值;
- 首个非NA年龄的行,保持原始值不变;
- 后续行通过
基准年龄 + (当前行号 - 基准行号)实现"前一年年龄加1"的效果。
内容的提问来源于stack exchange,提问作者Muhammad Kamil
相关产品推荐
相关产品推荐

