首页 > 解决方案 > 使用列的前一行值作为当前行值的参数创建一个新的 tibble

问题描述

我想手动创建一个小标题,其中一个列值是根据同一列的前一个值计算的。

例如:

tibble(
  x = 1:5,
  y = x + lag(y, default = 0)
)

我期待以下结果:

# A tibble: 5 x 2
      x     y
  <int> <dbl>
1     1     1
2     2     3
3     3     6
4     4    10
5     5    15

但我得到错误:

Error in lag(y, default = 0) : object 'y' not found

更新 - 更真实的例子:

tibble(
  years = 1:5,
  salary = 20000 * (1.01) ^ lag(years, default = 0),
  qta = salary * 0.06
) %>%
  mutate(
    total = ifelse(row_number() == 1,
                   (qta + 50000) * (1.02),
                   (qta + lag(total, default = 0)) * (1.02))
  )

在此示例中,我有一个小标题,我想添加一个根据其先前值定义的列“总计”,但lag(total, default = 0)它不起作用。

标签: rtidyverse

解决方案


我们可以用accumulate

library(tidyverse)
tibble(x = 1:5, y = accumulate(x, `+`))
# A tibble: 5 x 2
#      x     y
#  <int> <int>
#1     1     1
#2     2     3
#3     3     6
#4     4    10
#5     5    15

对于一般功能,它将是

tibble(x = 1:5, y = accumulate(x, ~ .x + .y))

我们也可以指定初始化值

tibble(x = 1:5, y = accumulate(x[-1], ~ .x + .y, .init = x[1]))

推荐阅读