Возврат строки в функцию

Я пытаюсь создать матрицу того, попадает ли дата в диапазон, созданный двумя моими столбцами, Data $ StartDate и Data $ EndDate. С этой целью я создал функцию ниже

DatesChecked <- as.character(seq(as.Date("2012-06-30"), as.Date("2017-12-09"), by = "day"))

CheckOpen <- function(x, row, column){
  if (Data$StartDate[row] > as.Date(column)) {
    return(0)
  } else {
    if (is.na(Data$EndDate[row])) {
      return(1)
  } else {
    ifelse(Data$EndDate > as.Date(column), return(1), return(0))
  }
  }
}

Data[,DatesChecked] <- mapply(CheckOpen, Data[,DatesChecked])

Однако я не уверен, как передать индекс строки в качестве аргумента моей функции. Я добавил «ряд» в качестве наполнителя.

В конечном счете, однако, я сильно подозреваю, что выбрал совершенно неправильный подход. Что я собираюсь сделать дальше, так это взять сумму каждого столбца и поместить их обратно в качестве нового столбца в «DatesChecked», и это кажется слишком сложным методом (т.е. я подсчитываю, сколько строк каждая дата попадает в диапазон из).

Пример данных:

      StartDate       EndDate
         <dttm>        <dttm>
1    2012-10-16    2014-02-19
2    2012-10-17    2013-04-16
3    2012-11-05    2013-04-22
4    2012-11-14    2013-05-01
5    2013-03-20    2013-08-29
6    2013-04-07    2013-09-09

В столбце с заголовком «2014-01-01» результаты будут c(1,0,0,0,0,0), так как первая строка — единственная, где она попадает в диапазон.


person Daniel V    schedule 22.01.2018    source источник
comment
Если бы вы могли предоставить небольшое количество примеров данных, возможно, включая столбец с вашим ожидаемым результатом, вам было бы легче помочь.   -  person Daniel Anderson    schedule 23.01.2018
comment
Обновил, надеюсь поможет   -  person Daniel V    schedule 23.01.2018
comment
Вы надеялись получить полную матрицу данных? Или просто сумма дат, которая попадает между интервалами.   -  person Daniel Anderson    schedule 23.01.2018
comment
Просто сумма. Я бы сжал матрицу в суммы.   -  person Daniel V    schedule 23.01.2018
comment
Ах хорошо. Я неправильно понял.   -  person Daniel Anderson    schedule 23.01.2018


Ответы (2)


Ниже приведено довольно простое и понятное решение.

DatesChecked <- seq(as.Date("2012-06-30"), as.Date("2017-12-09"), by = "day")

# summing TRUEs is like summing ones
cbind.data.frame(
  DatesChecked,
  sapply(DatesChecked, function(x) {
    sum(x > Data$StartDate & x < Data$EndDate)
  })
)
person RolandASc    schedule 22.01.2018

Вот один подход. Сначала напишите функцию, которая проверяет, находится ли определенная дата x между двумя другими датами d1 и d2.

check <- function(x, d1, d2) ifelse(x >= d1 & x <= d2, 1, 0)

Затем загрузите tidyverse и прокрутите все проверенные даты с помощью purrr::map, установите имена как даты, а затем свяжите все столбцы вместе.

library(tidyverse)
df_checked <- map(DatesChecked, ~check(., d$StartDate, d$EndDate)) %>% 
  set_names(DatesChecked) %>% 
  bind_cols()

# Show first five columns
df_checked[ ,1:5]

# A tibble: 6 x 5
  `2012-06-30` `2012-07-01` `2012-07-02` `2012-07-03` `2012-07-04`
         <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
1            0            0            0            0            0
2            0            0            0            0            0
3            0            0            0            0            0
4            0            0            0            0            0
5            0            0            0            0            0
6            0            0            0            0            0

# Show specific column mentioned in question
df_checked["2014-01-01"]

# A tibble: 6 x 1
  `2014-01-01`
         <dbl>
1         1.00
2         0   
3         0   
4         0   
5         0   
6         0  
person Daniel Anderson    schedule 22.01.2018