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

如何在R中一站式实现数据框的ID筛选、年份重排及差值计算

R数据框转换:整合代码实现多步操作

原始数据

df <- data.frame (ID  = c("A1","A1","A1","A2","A2","A3","A3","A3","A3","A4","A4","A4","A4"),
                  status = c(1,1,0,1,0,1,1,1,0,1,1,1,1),
                  value = c( 10,12,0,40,42,30,31,34,0,32,34,36,37),
                  year = c(2000,2005,2010,2005,2010,2000,2005,2010,2015,2000,2005,2010,2015
                  ))

需求

需要一次性完成以下操作:

  • 仅保留ID出现3次及以上的记录
  • 将数据按连续3个年份分组重排,每行对应一组连续三年的数据
  • 保留各年份的status字段
  • 计算第二年与第一年、第三年与第二年的value差值

整合代码实现

使用dplyr包即可完成所有步骤,代码简洁高效:

library(dplyr)

df_result <- df %>%
  # 1. 筛选ID出现次数≥3的组
  group_by(ID) %>%
  filter(n() >= 3) %>%
  # 2. 用lead()获取下一年、下两年的对应字段
  mutate(
    Year2 = lead(year),
    Year3 = lead(year, 2),
    Value2 = lead(value),
    Value3 = lead(value, 2),
    Status2 = lead(status),
    Status3 = lead(status, 2),
    # 3. 计算value差值
    DiffValue1 = Value2 - value,
    DiffValue2 = Value3 - Value2
  ) %>%
  # 4. 过滤掉无法组成连续三年的末尾行
  filter(!is.na(Year3)) %>%
  # 5. 重命名列以匹配目标格式
  rename(Year1 = year, Value1 = value, Status1 = status) %>%
  # 6. 按目标顺序选择列并取消分组
  select(ID, Year1, Year2, Year3, Value1, Value2, Value3, DiffValue1, DiffValue2, Status1, Status2, Status3) %>%
  ungroup()

# 查看结果
print(df_result)

代码解释

  • group_by(ID) %>% filter(n() >=3):先按ID分组,只保留组内记录数≥3的组
  • lead()函数:直接获取当前行的下一行(lead(x))和下两行(lead(x,2))的数据,快速生成连续三年的字段
  • filter(!is.na(Year3)):去掉组内最后两行(因为这两行无法获取到第三年的数据)
  • 最后通过rename()和select()整理成目标要求的列名和顺序

运行后得到的结果与你提供的目标数据完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:53:12