【问题标题】:Create a counter that only counts a certain logical value and gives the same number to repetitions创建一个只计算某个逻辑值并为重复次数提供相同数量的计数器
【发布时间】:2020-10-05 08:12:23
【问题描述】:

假设我有这样的逻辑值

rex <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, NA)

如何创建一个计数器,它只计算TRUE,并将连续重复分组为计数器中的相同值。前任。有这样的东西:

1, NA, 2,2,NA, 3, NA

【问题讨论】:

    标签: r dplyr datatable counter data-cleaning


    【解决方案1】:

    您可以使用rle 及其反函数:

     inverse.rle(modifyList(b<-rle(rex),list(values = with(b,cumsum(values)*NA^(!values)))))
    [1]  1 NA  2  2 NA  3 NA
    

    这也可以写成:

    inverse.rle(`[[<-`(b<-rle(rex),"values",with(b,cumsum(values)*NA^(!values))))
    

    分解:

    b <- rle(rex)
    b$values <- cumsum(b$values) * NA^(!b$values)
    inverse.rle(b)
    

    【讨论】:

    • rex = c(NA, TRUE, FALSE) 呢?
    • @Henrik 好问题在这种情况下,只需使用b &lt;- rle(rex &amp; !is.na(rex))
    • @HelioCuve 这是一个完全不同的问题。请考虑询问。在这种情况下,许多人会告诉你如何去做。您可以返回此处并粘贴指向该新问题的链接。
    • 谢谢@Onyambu,刚刚删除了评论,她的问题stackoverflow.com/questions/62412349/…
    【解决方案2】:

    接受的解决方案不适用于以下情况:

    rex <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, NA, NA, TRUE)
    

    它打印1 NA 2 2 NA 3 NA NA NA

    以下函数返回正确答案:

    solution <- function (rex) {
      result <- c()
      counter <- 1
      consecutive <- FALSE
      for (i in 1:length(rex)) {
        if (rex[i] == TRUE && !is.na(rex[i]) && consecutive) {
          result <- c(result, counter)
          consecutive <- TRUE
        } else if (rex[i] == TRUE && !is.na(rex[i]) && !consecutive) {
          result <- c(result, counter)
          consecutive <- TRUE
        } else{
          if(i < length(rex) && rex[i+1] == TRUE && !is.na(rex[i+1])){
            counter <- counter + 1
          }
          result <- c(result, NA)
          consecutive <- FALSE
        }
      }
      return(result)
    }
    

    调用solution(rex) 打印出1 NA 2 2 NA 3 NA NA 4,这是正确的答案。

    【讨论】:

      【解决方案3】:

      @Onyambu 提供的答案可能是:

      with(rle(!is.na(rex) & rex), rep(cumsum(values), lengths)) * rex^NA
      
      [1]  1 NA  2  2 NA  3 NA
      

      当 NA 不只是在向量的末尾时,它也应该工作。

      【讨论】:

        猜你喜欢
        • 2019-01-27
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        相关资源
        最近更新 更多