如何使用dplyr为长格式DataFrame添加b_diff差值计算行?
用dplyr为每个car-qtr组合添加b_diff记录的实现方法
首先先还原你的原始数据,方便后续操作:
text <- " parameter,car,qtr,val a,a3,FY18Q1,23 b,a3,FY18Q1,10000 a,a3,FY18Q2,14 b,a3,FY18Q2,12000 a,cla,FY18Q1,15 b,cla,FY18Q1,12000 c,cla,FY18Q1,5.5 a,cla,FY18Q2,26 b,cla,FY18Q2,10000 c,cla,FY18Q2,6.2 " df <- read.table(textConnection(text), sep = ",", header = TRUE)
你的需求很明确:为每个car和qtr的组合新增一行parameter为b_diff的记录,val是当前qtr的parameter=b值减去上一个qtr的对应值;第一个qtr(FY18Q1)的b_diff的val设为NA。
用dplyr可以轻松实现,具体代码和解释如下:
library(dplyr) # 第一步:生成所有car的b_diff记录 b_diff_records <- df %>% # 只筛选parameter为b的行 filter(parameter == "b") %>% # 按car分组,保证同一车型的计算独立 group_by(car) %>% # 按qtr排序,确保计算差值的顺序是FY18Q1到FY18Q2 arrange(qtr, .by_group = TRUE) %>% # 计算当前b值与上一个qtr的b值的差值,同时修改parameter为b_diff mutate(val = val - lag(val), parameter = "b_diff") %>% # 取消分组,方便后续合并 ungroup() # 第二步:合并原数据和b_diff记录,并按car、qtr、parameter排序,得到最终结果 final_df <- df %>% bind_rows(b_diff_records) %>% arrange(car, qtr, parameter) # 查看最终结果 print(final_df, row.names = FALSE)
代码解释
- 筛选与分组:先把所有
parameter=b的记录挑出来,按car分组,这样每个车型的差值计算不会互相干扰。 - 排序与差值计算:用
arrange保证qtr的顺序是升序,然后用lag(val)获取上一个qtr的b值,计算当前值减上一个值的差值,同时把parameter字段改成b_diff。 - 合并与排序:用
bind_rows把原数据和新生成的b_diff记录合并,最后按car、qtr、parameter排序,让结果和你预期的格式一致。
运行代码后得到的输出如下:
parameter car qtr val a a3 FY18Q1 23 b a3 FY18Q1 10000 b_diff a3 FY18Q1 NA a a3 FY18Q2 14 b a3 FY18Q2 12000 b_diff a3 FY18Q2 2000 a cla FY18Q1 15 b cla FY18Q1 12000 c cla FY18Q1 5.5 b_diff cla FY18Q1 NA a cla FY18Q2 26 b cla FY18Q2 10000 c cla FY18Q2 6.2 b_diff cla FY18Q2 -2000
内容的提问来源于stack exchange,提问作者user3206440
相关产品推荐
相关产品推荐

