Home > Back-end >  How to slice the head of a dataframe until first time TRUE shows up in a certain column?
How to slice the head of a dataframe until first time TRUE shows up in a certain column?

Time:03-10

I would like to slice the head of my dataframe after the first time TRUE shows up in a certain column.

dataframe <- data.frame(C1 = c(4.32, 8.4, 6.43, 7.98, 5.68, 4.97), C2 = c(4.32, 9.87, 5.43, 6.54, 2.34, 6.59), Logical = c(FALSE, FALSE, TRUE, FALSE, TRUE, FALSE))

That the output would look like this:

dataframe_new <- data.frame(C1 = c( 7.98, 5.68, 4.97), C2 = c(6.54, 2.34, 6.59), Logical = c(FALSE, TRUE, FALSE))

Thanks in advance!

It would be great if someone knew how to do it in a list as well...

CodePudding user response:

Here is a base R approach:

  • which(dataframe$Logical == T)[1] returns the row index of the first occurrence of TRUE in the Logical column
  • (which(dataframe$Logical == T)[1] 1) therefore specifies one row after the first TRUE
  • (which(dataframe$Logical == T)[1] 1):nrow(dataframe) therefore output rows starting from one row after the first occurrence of TRUE to the number of row of dataframe, that is the end of dataframe
dataframe[(which(dataframe$Logical == T)[1]   1):nrow(dataframe), ]

    C1   C2 Logical
1 7.98 6.54   FALSE
2 5.68 2.34    TRUE
3 4.97 6.59   FALSE

CodePudding user response:

You could use cumsum to get every rows after the first TRUE value (including the first TRUE value), and then use tail(., -1) to remove the first TRUE.

tail(dataframe[cumsum(dataframe$Logical) >= 1,], -1)

    C1   C2 Logical
4 7.98 6.54   FALSE
5 5.68 2.34    TRUE
6 4.97 6.59   FALSE

Another solution is to use cumany which by default set every value after the first TRUE to TRUE.

library(dplyr)
dataframe[complete.cases(cumany(lag(dataframe$Logical))),]
  • Related