简体   繁体   中英

Find rows after certain value in same column

I have a column in my dataframe containing ascending numbers which are interrupted by Zeros.
I would like to find all rows which come before a Zero and create a new datatable containing only these rows.

My Column: 1, 2, 3, 4, 0, 0, 1, 2, 3, 4, 5, 6, 0

What I need: 4, 6

Any help would be much appreciated! Thanks!

Welcome to SO!
You can try with base R. The idea is to fetch the rownames of the rows before the 0 and subset() the df by them:

# your data
df <- data.frame(col = c(1, 2, 3, 4, 0, 0, 1, 2, 3, 4, 5, 6, 0))

# an index that get all the rownames before the 0
index <- as.numeric(rownames(df)[df$col == 0]) -1

# here you subset your original df by index: there is also a != 0 to remove the 0 before 0
df_ <- subset(df, rownames(df) %in% index & col !=0) 
df_
   col
4    4
12   6

A dplyr solution:

library(dplyr)

df %>%
  filter(lead(x) == 0, x != 0)
#>   x
#> 1 4
#> 2 6

Created on 2021-07-08 by the reprex package (v2.0.0)

data

df <- data.frame(x = c(1, 2, 3, 4, 0, 0, 1, 2, 3, 4, 5, 6, 0))

Using base R:

df <- data.frame(x = c(1, 2, 3, 4, 0, 0, 1, 2, 3, 4, 5, 6, 0),
                 y = LETTERS[1:13])

df[diff(df$x)<0,]

   x y
4  4 D
12 6 L

Using Run Lengths in base R. To get the index of x , add the run lengths until 0 value occurs.

x <- c(1, 2, 3, 4, 0, 0, 1, 2, 3, 4, 5, 6, 0)

y <- rle(x)  
x[cumsum(y$lengths)][which(y$values == 0) - 1]
# [1] 4 6

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM