Как изменить значения вектора вектора с предыдущим условием? - PullRequest
4 голосов
/ 12 марта 2020

У меня есть логический вектор vector1 <- c(F,F,T,F,F), и я хочу создать vector2 с теми же значениями, что и vector1, но когда vector1[i] == TRUE vector2[i-1], vector2[i] and vector2[i+1] также должно быть TRUE. Каков наилучший способ сделать это? в идеале было бы также создать функцию, так как мне придется это делать для многих других векторов ...

Ответы [ 3 ]

4 голосов
/ 12 марта 2020

Одним из способов использования логического сравнения является:

c(vector1[-1], FALSE) | vector1 | c(FALSE, vector1[-length(vector1)])

Значение равно TRUE в позиции, если предшествующим является TRUE, или позицией является TRUE, или следующей позицией является TRUE , Первое и последнее значения являются границами и не имеют предшествующих или следующих значений, поэтому позиции заполняются на FALSE.

Для более чем одной позиции здесь два:

lag <- 2
c(vector1[-(1:lag)], rep(FALSE, lag)) | vector1 | c(rep(FALSE, lag), vector1[-(length(vector1)-lag+1:length(vector1))])
[1]  TRUE FALSE  TRUE FALSE  TRUE
3 голосов
/ 12 марта 2020

Вы также можете попробовать dplyr:

case_when(lead(vector1) ~ TRUE,
          lag(vector1) ~ TRUE,
          TRUE ~ vector1)

[1] FALSE  TRUE  TRUE  TRUE FALSE
2 голосов
/ 12 марта 2020

Вы можете сделать:

#Copy vector1 elements
vector2 <- vector1
#Get indices where vector has TRUE elements
inds <- which(vector2)
#Get +1 and -1 position of each TRUE value
inds1 <- unique(c(inds + 1, inds -  1))
#Remove values which are out of range
inds1 <- inds1[inds1 <= length(vector2) & inds1 >= 1]
#Assign TRUE values
vector2[inds1] <- TRUE
vector2
#[1] FALSE  TRUE  TRUE  TRUE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...