代码之家  ›  专栏  ›  技术社区  ›  Oluf Sändrostrom

如何将R中一列中的一行与另一列中的下5-10行进行匹配?

  •  0
  • Oluf Sändrostrom  · 技术社区  · 2 年前

    我在R中有一个表(单击下面的链接(请参见我的表)),其中显示了每天对两个事件的观察:observ1和observ2。我想在“检查”栏中添加第三列。在列检查中,如果observ1等于1,并且在5到10天之后,observ2也等于1,我应该得到一个真值。

    如表中所示,第14行的检查值为TRUE。原因是第6行的observ1为1,9天后,observ2也为1。

    我不知道如何在R中对其进行编码,并退出“check”列。感谢您的帮助!

    See my table here

    1 回复  |  直到 2 年前
        1
  •  1
  •   hello_friend    2 年前

    这被认为不是一个好的提问方式,通常大多数海报都会使用 dput() 根据他们的数据。框架中提供了要在问题中上载的数据示例。此函数的结果将以我在下面所做的格式从控制台复制和粘贴(请参见数据)。对于未来的问题,这被认为是良好的做法。无论如何,希望此解决方案有助于:

    基本R解决方案:

    df1$check <- with(
      df1, 
      vapply(
        seq_along(observ2),
        function(i){
          if(i - 5 <= 0){
            NA
          }else{
            ir <- max(i-10, 1)
            ir2 <- (any(observ1[ir:(i-5)] == 1) & observ2[i] == 1)
            ifelse(ir2, ir2, NA)
            }
          },
        logical(1)
      )
    )
    

    数据:

    df1 <- structure(list(day = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
    13, 14, 15, 16, 17, 18, 19, 20), observ1 = c(1, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0), observ2 = c(0, 0, 
    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1)), class = c("tbl_df", 
    "tbl", "data.frame"), row.names = c(NA, -20L))