如何在R中创建基于前一行值计算结果的新列
你现有代码不生效的核心原因是dplyr::mutate为向量化运算,会一次性计算所有行的字段值,不会逐行迭代读取刚生成的上一行periodNumber结果,因此直接引用lag(periodNumber)无法得到预期值。
以下是适配不同场景的解决方案:
场景1:日期严格按顺序排列、无重复
直接用行号生成即可,代码最简单:
library(dplyr) dat <- dat %>% mutate(periodNumber = row_number())
场景2:需完全匹配Excel公式逻辑(支持重复/非连续日期)
实现逻辑和你的Excel公式完全一致:第一行编号为1,后续行如果和上一行日期相同则沿用前一行编号,不同则编号加1,用累计求和即可实现:
library(dplyr) dat <- dat %>% mutate(periodNumber = cumsum(coalesce(date != lag(date), TRUE)))
代码逻辑说明:
date != lag(date):判断当前行日期是否和上一行日期不同,结果为TRUE(对应数值1)或FALSE(对应数值0)coalesce(..., TRUE):将第一行lag(date)返回的空值替换为TRUE,保证第一行累计初始值为1cumsum():对上述判断结果累计求和,即可得到符合要求的周期编号
场景3:需自定义逐行迭代逻辑
如果后续有更复杂的逐行迭代需求,可以用purrr::accumulate实现自定义迭代规则:
library(dplyr) library(purrr) dat <- dat %>% mutate(periodNumber = accumulate(2:nrow(.), .init = 1, ~ ifelse(date[.y] == date[.y - 1], .x, .x + 1)))
内容的提问来源于stack exchange,提问作者freakingcloud
相关产品推荐
相关产品推荐

