Home > Blockchain >  How to find the first column with a certain value for each row with dplyr
How to find the first column with a certain value for each row with dplyr

Time:01-13

I have a dataset like this:

df <- data.frame(id=c(1:4), time_1=c(1, 0.9, 0.2, 0), time_2=c(0.1, 0.4, 0, 0.9), time_3=c(0,0.5,0.3,1.0))

id time_1 time_2 time_3
1    1.0    0.1    0
2    0.9    0.4   0.5
3    0.2     0    0.3
4     0     0.9   1.0

And I want to identify for each row, the first column containing a 0, and extract the corresponding number (as the last element of colname), obtaining this:

id time_1 time_2 time_3 count
 1    1.0    0.1    0     3
 2    0.9    0.4   0.5    NA
 3    0.2     0    0.3    2
 4     0     0.9   1.0    1

Do you have a tidyverse solution?

CodePudding user response:

We may use max.col

v1 <- max.col(df[-1] ==0, "first")
v1[rowSums(df[-1] == 0) == 0] <- NA
df$count <- v1

-output

> df
  id time_1 time_2 time_3 count
1  1    1.0    0.1    0.0     3
2  2    0.9    0.4    0.5    NA
3  3    0.2    0.0    0.3     2
4  4    0.0    0.9    1.0     1

Or using dplyr - use if_any to check if there are any 0 in the 'time' columns for each row, if there are any, then return the index of the 'first' 0 value with max.col (pick is from devel version, can replace with across) within the case_when

library(dplyr)
df %>%
   mutate(count = case_when(if_any(starts_with("time"),  ~ .x== 0) ~ 
    max.col(pick(starts_with("time")) ==0, "first")))

-output

   id time_1 time_2 time_3 count
1  1    1.0    0.1    0.0     3
2  2    0.9    0.4    0.5    NA
3  3    0.2    0.0    0.3     2
4  4    0.0    0.9    1.0     1

CodePudding user response:

You can do this:

df <- df %>% 
  rowwise() %>% 
  mutate (count = which(c_across(starts_with("time")) == 0)[1])

df
   id time_1 time_2 time_3 count
  <int>  <dbl>  <dbl>  <dbl> <dbl>
1     1    1      0.1    0       3
2     2    0.9    0.4    0.5    NA
3     3    0.2    0      0.3     2
4     4    0      0.9    1       1
  • Related