Cristian S.
Cristian S.

Reputation: 55

Search rows looking for 2 conditions (OR)

I have the following table, with ordered variables:

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

From a previous question, I have the following code provided from a user here, to search by row for one condition (1st and 2nd position > 0) and returning the position of the ocurrence (name of the variable for the specific position):

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

I'm looking to add a second condition to the apply code, so the conditions needs to be:

OR

Considering this change, the output of the evaluation for the table posted before should be:

For Id_01: never occurs (NA?)

For Id_02: 1st position (X01)

For Id_03: 3rd position (X03)

For Id_04: 1st position (X01)

For Id_05: never occurs (NA?)

For Id_06: 2nd position (X02)

Thanks in advance!

Upvotes: 3

Views: 57

Answers (1)

akrun
akrun

Reputation: 887108

We can use lag and lead from 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"

Or use pmap

library(purrr)
n1 <- pmap_int(table[-1], ~ c(...) %>% 
                   f1)
names(table)[-1][n1]

Upvotes: 1

Related Questions