Поиск строк, ищущих 2 условия (ИЛИ) - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующая таблица с упорядоченными переменными:

table <- data.frame(Ident = c("Id_01", "Id_02", "Id_03", "Id_04", "Id_05", "Id_06"), 
                    X01 = c(NA, 18, 0, 14, 0, NA), 
                    X02 = c(0, 16, 0, 17, 0, 53), 
                    X03 = c(NA, 15, 20, 30, 0, 72), 
                    X04 = c(0, 17, 0, 19, 0, NA), 
                    X05 = c(NA, 29, 21, 23, 0, 73), 
                    X06 = c(0, 36, 22, 19, 0, 55))

Ident   X01 X02 X03 X04 X05 X06
Id_01   NA  0   NA  0   NA  0
Id_02   18  16  15  17  29  36
Id_03   0   0   20  0   21  22
Id_04   14  17  30  19  23  19
Id_05   0   0   0   0   0   0
Id_06   NA  53  72  NA  73  55

Из предыдущего вопроса у меня есть следующий код, предоставленный пользователем здесь , для поиска по строке одногоусловие (1-я и 2-я позиция> 0) и возврат позиции вхождения (имя переменной для конкретной позиции):

apply(table[-1], 1, function(x) {
    i1 <- x > 0 & !is.na(x)
    names(x)[which(i1[-1] & i1[-length(i1)])[1]]})

Я ищу, чтобы добавить второе условие к applyкод, поэтому условия должны быть:

  • 1-е и 2-е вхождение (последовательное)> 0

ИЛИ

  • 1-е и 3-е вхождение> 0

Учитывая это изменение, результат оценки для таблицы, опубликованной ранее, должен быть:

Для Id_01: никогда не происходит (нет данных?)

Для Id_02: 1-я позиция (X01)

Для Id_03: 3-я позиция (X03)

Для Id_04: 1-я позиция (X01)

Для Id_05: никогда не происходит (нет?)

Для Id_06: 2-я позиция (X02)

Заранее спасибо!

1 Ответ

0 голосов
/ 04 октября 2018

Мы можем использовать lag и lead из dplyr

library(dplyr)
f1 <- function(x) {
    i1 <- x > 0 & !is.na(x)
  which((i1 & lag(i1, default = i1[1])) | 
      (i1 & lead(i1, n = 3, default = i1[1])))[1]
        }
n1 <- apply(table[-1], 1, f1)
names(table)[-1][n1]
#[1] NA    "X01" "X03" "X01" NA    "X02"

Или использовать pmap

library(purrr)
n1 <- pmap_int(table[-1], ~ c(...) %>% 
                   f1)
names(table)[-1][n1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...