Суммирование в списке в dplyr - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть тиббл, в котором есть дата, день квартала и список того, являются ли дни в квартале днями продаж или нет (1/0). Я хотел бы суммировать список дней продаж (чтобы получить количество дней продаж, оставшихся в квартале) путем суммирования от day_num до конца sales_day_list Итак, за первый день второго квартала , 1993, я хотел бы суммировать с 1: конец sales_day_list , чтобы получить 64. Во второй день я хотел бы сложить с 2: конец sales_day_list и т. Д.

Вот пример моих данных (вывод из dput)

my_data= structure(list(DW_DATE_ID = structure(c(733622400, 733708800, 
733795200, 733881600, 733968000, 734054400), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), day_num = 1:6, sales_day_list = list(
    c(1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 
    1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 
    1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 
    0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 
    1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0), c(1, 0, 0, 
    1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 
    0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 
    1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 
    1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 
    0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0), c(1, 0, 0, 1, 1, 1, 
    1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 
    1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 
    0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
    1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 
    1, 1, 1, 0, 0, 1, 1, 1, 0), c(1, 0, 0, 1, 1, 1, 1, 1, 0, 
    0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
    1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 
    1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 
    1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 
    0, 0, 1, 1, 1, 0), c(1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 
    1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 
    1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 
    0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 
    1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 
    1, 1, 0), c(1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 
    0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 
    1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 
    1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 
    0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0))), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Сначала мы можем составить таблицу только по дням продаж и подсчитать, сколько осталось в qtr.

sales_days <- my_data[1,3] %>%   # Grab row 1, column 3
  tidyr::unnest() %>%
  rename(sales_day = sales_day_list) %>%
  mutate(day_num = row_number()) %>%
  arrange(-day_num) %>%
  mutate(remaining_sales = cumsum(sales_day)) %>%
  arrange(day_num)

Тогда мы можем прикрепить это к my_data:

my_data2 <- my_data[,1:2] %>%
  left_join(sales_days)

head(my_data2)
# A tibble: 6 x 4
  DW_DATE_ID          day_num sales_day remaining_sales
  <dttm>                <int>     <dbl>           <dbl>
1 1993-04-01 00:00:00       1         1              64
2 1993-04-02 00:00:00       2         0              63
3 1993-04-03 00:00:00       3         0              63
4 1993-04-04 00:00:00       4         1              63
5 1993-04-05 00:00:00       5         1              62
6 1993-04-06 00:00:00       6         1              61
0 голосов
/ 14 сентября 2018

После проверки значение sales_day_list одинаково для каждой строки, что имеет смысл, поскольку дни продаж не должны меняться в течение квартала.

Чтобы решить эту проблему, возьмите день квартала и дней продаж в качестве векторов, а затем напишите функцию, чтобы применить сумму ко вектору дней продаж, подставив ее в день квартала.

x <- my_data$day_num # days as vector
y <- my_data$sales_day_list[[1]] # can be any one of them
sapply(x, function(x){sum(y[x:length(y)])}) # desired output

Вы можете назначить вывод последней строки обратно в ваш фрейм данных.

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