Создайте новый тиббл, используя предыдущее значение строки столбца в качестве параметра текущего значения строки - PullRequest
1 голос
/ 05 мая 2019

Я хочу вручную создать таблицу, в которой значения одного столбца рассчитываются в зависимости от предыдущего значения этого же столбца.

Например:

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))
  )

В этом примере у меня есть тиббл, и я хочу добавить столбец 'total', который определяется в зависимости от его предыдущего значения, но lag(total, default = 0) не работает.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Вы пропускаете x вместо y в функции lag (), чтобы работать без ошибок:

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

Но, согласно комментарию @Ronak Shah, вам нужна функция cumsum (), чтобы получитьтот же результат, что и в вашем примере:

tibble(
 x = 1:5, 
 y = cumsum(x)
)
1 голос
/ 05 мая 2019

Мы можем использовать 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]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...