Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine if TRUE occurs before FALSE in two columns

Tags:

r

I have a list of TRUE/FALSE statements in two columns. I want to determine if a test passes before it fails, a test fails before it passes, or neither. I am trying to create an output for each situation as well.

So for example if a test passes before it fails

   Pass  Fail
1  TRUE FALSE
2 FALSE FALSE
3 FALSE FALSE

I want the output to say which event occurred and then the row number at which it occurred so for the example above the output would look like this

Pass 1

Another example of a test that failed

   Pass  Fail
1 FALSE FALSE
2 FALSE  TRUE
3  TRUE FALSE

The expected output would look like

Fail 2

And then a situation where there was no pass or fail

   Pass  Fail
1 FALSE FALSE
2 FALSE FALSE
3 FALSE FALSE

and the expected output would be

None 0

As I mentioned before, I want to find out which event occurs first.

Pass dataset

structure(list(Pass = c(TRUE, FALSE, FALSE), Fail = c(FALSE, 
FALSE, FALSE)), row.names = c(NA, 3L), class = "data.frame")

Fail dataset

structure(list(Pass = c(FALSE, FALSE, TRUE), Fail = c(FALSE, 
TRUE, FALSE)), row.names = c(NA, 3L), class = "data.frame")

None dataset

structure(list(Pass = c(FALSE, FALSE, FALSE), Fail = c(FALSE, 
FALSE, FALSE)), row.names = c(NA, 3L), class = "data.frame")
like image 827
neuron Avatar asked Sep 15 '25 13:09

neuron


1 Answers

One option relevant for scenarios when only one value is of interest could be:

fun <- function(data) {
    ind <- sapply(data, function(x) match(TRUE, x))
    
    if(all(is.na(ind))) {
        setNames(0, "None")
    } else {
        ind[which.min(ind)]
    }
}

Results for the first dataset:

Pass 
   1 

second:

Fail 
   2

third:

None 
   0

If the output is supposed to be a dataframe, then it could be adjusted to:

fun <- function(data) {
    ind <- sapply(data, function(x) match(TRUE, x))
    
    if(all(is.na(ind))) {
        stack(setNames(0, "None"))
    } else {
        stack(ind[which.min(ind)])
    }
}

  values  ind
1      2 Fail
like image 53
tmfmnk Avatar answered Sep 17 '25 04:09

tmfmnk