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

在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

逻辑说明

  1. 分组处理:按student分组,确保每个学生的年龄计算独立进行。
  2. 定位基准值:找到每个学生第一个非NA的年龄(base_age)及其所在行(base_pos)。
  3. 计算更新年龄:
    • 首个非NA年龄之前的行,保留原始的NA值;
    • 首个非NA年龄的行,保持原始值不变;
    • 后续行通过基准年龄 + (当前行号 - 基准行号)实现"前一年年龄加1"的效果。

内容的提问来源于stack exchange,提问作者Muhammad Kamil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:55:27