如何在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
相关产品推荐
相关产品推荐

