делая «истинное» значение в логическом векторе уникальным - PullRequest
3 голосов
/ 17 января 2020

У меня, казалось бы, простая проблема, но я не могу найти хорошее решение для нее.

У меня есть логический вектор, например:

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

Я хочу, чтобы этот вектор содержал только одно значение ИСТИНА. Таким образом, один из них должен быть превращен в ЛОЖЬ. Я не хочу делать это вручную, потому что это часть al oop. Обычно в l oop генерируемый логический вектор будет содержать только одно значение TRUE. Иногда он генерирует два или более, и если это происходит, я хочу «удалить» другие ИСТИННЫЕ значения.

Я попробовал это:

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

, но затем я получаю ошибку: Error in which(vector) <- '*vtmp*' : could not find function "which<-"

Ответы [ 4 ]

7 голосов
/ 17 января 2020

Вот вариант

vector & cumsum(vector) <2
3 голосов
/ 17 января 2020

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
2 голосов
/ 17 января 2020

Вы можете решить эту проблему следующим образом:

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

В этом коде вы присваиваете ЛОЖЬ все ИСТИНА, кроме первого. В этом другом коде вы присваиваете ЛОЖЬ все ИСТИНА, кроме последнего:

vector[vector == TRUE][1:(length(vector[vector == TRUE])-1)] = FALSE
1 голос
/ 17 января 2020

Простой способ, который сохраняет первое ИСТИННОЕ значение и делает остальное ЛОЖНЫМ:

s=0
for(i in 1:length(vector)) {  
  if(s==1){
    vector[i]=FALSE
  } 
  if(vector[i]) s=1 
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...