代码之家  ›  专栏  ›  技术社区  ›  Daniel V

将行返回到函数

  •  0
  • Daniel V  · 技术社区  · 6 年前

    我试图创建一个矩阵,以确定日期是否在我的两列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])
    

    但是,我不确定如何将行索引作为参数传递给函数。我加了“row”作为填充词。

    但最终,我强烈怀疑我采取了完全错误的方法。接下来我要做的是将每列的总和作为“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) 因为第一行是唯一一个落在该范围内的行。

    2 回复  |  直到 6 年前
        1
  •  1
  •   RolandASc    6 年前

    下面是一个非常简单明了的解决方案。

    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)
      })
    )
    
        2
  •  1
  •   Daniel Anderson    6 年前

    这里有一种方法。首先,编写一个函数,检查特定日期 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