Как сделать скользящее / вычитаемое время, одновременно обновляя основную сумму? - PullRequest
0 голосов
/ 28 января 2020

Предположим data frame, как показано ниже:

library(tidyverse)
df1 <- tibble(product = paste0("product", 1:4)) %>% 
  mutate(moneyAvailable = 20,
         productPrice = rnorm(n = nrow(.), mean = 7, sd = 1))
df1
#> # A tibble: 4 x 3
#>   product  moneyAvailable productPrice
#>   <chr>             <dbl>        <dbl>
#> 1 product1             20         6.53
#> 2 product2             20         8.67
#> 3 product3             20         6.15
#> 4 product4             20         6.60

Я хотел бы рассчитать промежуточную сумму, которая для 1-й строки вычитает productPrice из moneyAvailable, но использует полученное значение вычесть из productPrice во 2-й строке и так далее ...

Окончательный результат будет примерно таким (что я жестко кодирую).
Моя собственная попытка состояла в том, чтобы попытаться используйте комбинацию lag из dplyr и cumsum, но здесь они не имеют отношения.

df1$moneyRemaining = c(14.77, 6.95, 0.86, -7.05)
df1
#> # A tibble: 4 x 4
#>   product  moneyAvailable productPrice moneyRemaining
#>   <chr>             <dbl>        <dbl>          <dbl>
#> 1 product1             20         6.53          14.8 
#> 2 product2             20         8.67           6.95
#> 3 product3             20         6.15           0.86
#> 4 product4             20         6.60          -7.05

Создано в 2020-01-28 пакетом Представить (v0.3.0)

1 Ответ

1 голос
/ 28 января 2020

Вот как бы я решил это. Мы используем row_number, чтобы выяснить порядок транзакций. Если это первая транзакция, мы делаем money - price, в противном случае мы просто вычитаем цену, используя cumsum.

df1 %>%
    mutate(rownum = row_number()) %>%
    mutate(moneyRemaining = cumsum(ifelse(rownum == 1, 
                                          moneyAvailable - productPrice, 
                                          -productPrice)))

#   product  moneyAvailable productPrice rownum moneyRemaining
#   <chr>             <dbl>        <dbl>  <int>          <dbl>
# 1 product1             20         6.87      1         13.1  
# 2 product2             20         5.90      2          7.23 
# 3 product3             20         6.58      3          0.649
# 4 product4             20         6.11      4         -5.46 

Для большого набора данных (возможно, с несколькими клиентами), вы захотите убедитесь, что ваши данные отсортированы правильно (arrange), и тогда вы можете использовать group_by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...