【问题标题】:making 'true' value in logical vector unique使逻辑向量中的“真”值唯一
【发布时间】:2020-01-17 17:12:25
【问题描述】:

我有一个看似简单的问题,但我似乎找不到一个好的解决方案。

我有一个逻辑向量,像这样:

vector = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE)

我希望该向量仅包含一个 TRUE 值。所以其中一个需要变成 FALSE。我不想手动操作,因为这是循环的一部分。通常,在循环中生成的逻辑向量将只包含一个 TRUE 值。有时它会生成两个或更多,如果发生这种情况,我想“删除”其他 TRUE 值。

我试过这个:

if(length(which(vector)) > 1) {
    for(j in 1:(length(which(vector)) - 1)) {
      which(vector)[j] <- FALSE
    }
  }

然后我得到一个错误:Error in which(vector) &lt;- '*vtmp*' : could not find function "which&lt;-"

【问题讨论】:

  • replace(vector, which(vector)[-1], FALSE)
  • replace(vector, -which.max(vector), FALSE)

标签: r


【解决方案1】:

这是一个选项

vector & cumsum(vector) <2

【讨论】:

    【解决方案2】:

    which.max(x) 会给你第一个TRUE 值的索引,你可以将FALSE 分配给其他人

    x = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE)
    x[-which.max(x)] <- FALSE
    x
    #>  [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    

    【讨论】:

      【解决方案3】:

      你可以这样解决问题:

      vector[vector == TRUE][2:length(vector[vector == TRUE])] = FALSE
      

      在此代码中,您将除第一个之外的所有 TRUE 分配给 FALSE。在此其他代码中,您将除最后一个之外的所有 TRUE 分配给 FALSE:

      vector[vector == TRUE][1:(length(vector[vector == TRUE])-1)] = FALSE
      

      【讨论】:

        【解决方案4】:

        保持第一个 TRUE 值并使其余值为 FALSE 的简单方法:

        s=0
        for(i in 1:length(vector)) {  
          if(s==1){
            vector[i]=FALSE
          } 
          if(vector[i]) s=1 
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-26
          • 1970-01-01
          • 2013-10-15
          • 2021-10-01
          • 2021-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多