Динамическая сумма, основанная на условии - PullRequest
1 голос
/ 16 мая 2019
df <-data.frame(
  part = c('A','B','c'),
  start_date = c('2018-12-01','2018-12-06','2018-12-08'),
  end_date = c('2018-12-05','2018-12-07','2018-12-11'),
  X2018.12.01 = c(2,3,4),
  X2018.12.02 = c(5,6,0),
  X2018.12.03 = c(0,3,0),
  X2018.12.04 = c(5,9,1),
  X2018.12.05 = c(1,2,3),
  X2018.12.06 = c(2,3,4),
  X2018.12.07 = c(1,1,1),
  X2018.12.08 = c(6,6,6),
  X2018.12.09 = c(8,7,6),
  X2018.12.10 = c(0,1,1),
  X2018.12.11 = c(1,2,3))

df1 <- setNames(df, c("part","start_date","end_date","2018-12-01",
"2018-12-02","2018-12-03","2018-12-04","2018-12-05","2018-12-06","2018- 
12-07","2018-12-08","2018-12-09","2018-12-10","2018-12-11"))

Теперь я хочу создать столбец в df1, который будет суммировать отдельные части на основе его start_date & end_date

  • part A: который должен суммироваться с 2018-12-01 по 2018-12-05, что составляет сумму 2,5,0,5,1, т. Е. 13,
  • часть B, которая должна суммироваться с 2018-12-06 по 2018-12-07, что составляет 3 + 1 =4
  • часть c, должна суммироваться с 2018-12-08 по 2018-12-11, что составляет 6 + 6 + 1 + 3 = 16

Я надеюсь, что смогу объяснитьмоя проблема.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Вот базовый подход R,

sapply(split(df1, seq(nrow(df1))), function(i) 
               rowSums(i[names(i) %in% as.character(seq.Date(as.Date(i$start_date[1]), 
                                                                     i$end_date[1], 
                                                                      by = 'days'))]))
#1.1 2.2 3.3 
#13   4  16 
0 голосов
/ 16 мая 2019
library(tidyverse)
df1 %>%
  gather(date, value, -c(part:end_date)) %>% 
  mutate_at(vars(start_date:date), lubridate::ymd) %>%
  filter(date >= start_date,
         date <= end_date) %>%
  count(part, wt = value)

## A tibble: 3 x 2
#  part      n
#  <fct> <dbl>
#1 A        13
#2 B         4
#3 c        16

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

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