Создание лага на основе значений другого столбца - PullRequest
1 голос
/ 20 мая 2019

У меня есть данные, которые выглядят так:

   month shop product sales sales_per_shop
1      1    1       1    10             90
2      1    1       2    20             90
3      1    2       1    40            120
4      1    3       2    50            150
5      2    1       1    10             90
6      2    1       2    20             90
7      2    2       1    40            120
8      2    3       2    50            150
9      3    1       1    10             90
10     3    1       2    20             90
11     3    2       1    40            120
12     3    3       2    50            150

Моя цель - создать месячный лаг для продаж и продаж в столбцах.

Для продаж это не проблема.потому что все строки различны.

z %>%
  group_by(shop, product) %>%
  mutate(lag_sales_per_shop = lag(sales, 1)) %>%
  head(5)

# A tibble: 5 x 6
# Groups:   shop, product [4]
  month  shop product sales sales_per_shop lag_sales
  <int> <dbl>   <dbl> <dbl>          <dbl>     <dbl>
1     1     1       1    10             90        NA
2     1     1       2    20             90        NA
3     1     2       1    40            120        NA
4     1     3       2    50            150        NA
5     2     1       1    10             90        10

Однако для sales_per_shop я не могу этого сделать:

z %>%
  group_by(shop) %>%
  mutate(lag_sales_per_shop = lag(sales_per_shop, 1)) 

# A tibble: 5 x 6
# Groups:   shop [3]
  month  shop product sales sales_per_shop lag_sales_per_shop
  <int> <dbl>   <dbl> <dbl>          <dbl>              <dbl>
1     1     1       1    10             90                 NA
2     1     1       2    20             90                 90
3     1     2       1    40            120                 NA
4     1     3       2    50            150                 NA
5     2     1       1    10             90                 90

Как видите, значение для первого месяца все еще существует.Так как я отстала на месяц, не должно быть ценности.Есть ли возможность отложить значение на основе другого?

Результат должен выглядеть следующим образом:

# A tibble: 12 x 7
# Groups:   shop, product [4]
   month  shop product sales sales_per_shop lag_sales lag_sales_per_shop
   <int> <dbl>   <dbl> <dbl>          <dbl>     <dbl>              <dbl>
 1     1     1       1    10             90        NA                 NA
 2     1     1       2    20             90        NA                 NA
 3     1     2       1    40            120        NA                 NA
 4     1     3       2    50            150        NA                 NA
 5     2     1       1    10             90        10                 90
 6     2     1       2    20             90        20                 90
 7     2     2       1    40            120        40                120
 8     2     3       2    50            150        50                150
 9     3     1       1    10             90        10                 90
10     3     1       2    20             90        20                 90
11     3     2       1    40            120        40                120
12     3     3       2    50            150        50                150

  structure(list(month = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L), shop = c(1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3), product = c(1, 
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), sales = c(10, 20, 40, 50, 10, 
20, 40, 50, 10, 20, 40, 50), sales_per_shop = c(90, 90, 120, 
150, 90, 90, 120, 150, 90, 90, 120, 150)), row.names = c(NA, 
-12L), class = "data.frame")

Ответы [ 2 ]

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

Вот еще одна версия с filter и bind_rows

library(dplyr)
z %>% 
  filter(month == first(month)) %>%       
  bind_rows(z %>% 
            filter(month != first(month)) %>%
            mutate(lag_sales = sales, lag_sales_per_shop = sales_per_shop))
#   month shop product sales sales_per_shop lag_sales lag_sales_per_shop
#1      1    1       1    10             90        NA                 NA
#2      1    1       2    20             90        NA                 NA
#3      1    2       1    40            120        NA                 NA
#4      1    3       2    50            150        NA                 NA
#5      2    1       1    10             90        10                 90
#6      2    1       2    20             90        20                 90
#7      2    2       1    40            120        40                120
#8      2    3       2    50            150        50                150
#9      3    1       1    10             90        10                 90
#10     3    1       2    20             90        20                 90
#11     3    2       1    40            120        40                120
#12     3    3       2    50            150        50                150
1 голос
/ 20 мая 2019

Вам, вероятно, нужно left_join -

df %>% 
  left_join(
    df %>%
      mutate(month = month + 1) %>% 
      distinct(shop, month, sales_per_shop) %>% 
      rename(lag_sales_per_shop = sales_per_shop),
    by = c("shop", "month")
  )


   month shop product sales sales_per_shop lag_sales_per_shop
1      1    1       1    10             90                 NA
2      1    1       2    20             90                 NA
3      1    2       1    40            120                 NA
4      1    3       2    50            150                 NA
5      2    1       1    10             90                 90
6      2    1       2    20             90                 90
7      2    2       1    40            120                120
8      2    3       2    50            150                150
9      3    1       1    10             90                 90
10     3    1       2    20             90                 90
11     3    2       1    40            120                120
12     3    3       2    50            150                150
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...