如何在dplyr的mutate中跳过指定行数选择行索引迭代生成新列
dplyr mutate 分组偏移计算解决方案
实现需求的代码如下:
library(dplyr) result <- df %>% # 按Itemnumber分组 group_by(Itemnumber) %>% # 统计每组行数 mutate(n = n()) %>% # 过滤行数大于1的分组 filter(n > 1) %>% mutate( # 临时存储计算结果,第i行对应新列第i+1行要填充的值 temp_calc = column_B + lead(column_A, 1L) - (lead(column_D, 1L) - lead(column_E, 1L)), # 拼接生成新列:第一行取当前分组column_B的首个值,后续行取临时计算结果去掉末尾NA的部分 new_col = c(first(column_B), temp_calc[-n()]) ) %>% # 按需删除临时计算列 select(-temp_calc)
逻辑说明
- 临时计算列
temp_calc的输出和你原有代码的new_col完全一致,其中第k行的值正是你要放到新列第k+1行的计算结果 - 构造新列时直接用向量拼接:第一个元素固定取当前分组
column_B的第一个值,后续元素直接取temp_calc去掉最后一位(即原本末尾的NA)的结果,刚好实现整体向下偏移1行的需求,同时避免了末尾出现NA - 如果原始数据分组内顺序不固定,建议在分组后增加
arrange(排序列)步骤,保证计算顺序符合业务逻辑
用你提供的示例数据测试,输出的80126分组结果和你给出的期望效果完全一致。
内容的提问来源于stack exchange,提问作者geometricfreedom
相关产品推荐
相关产品推荐

