Quantcast
Channel: Active questions tagged r - Stack Overflow
Viewing all articles
Browse latest Browse all 201977

Getting observations until and including first different value (groups with "no switch" are allowed)

$
0
0

I have a slightly convoluted way to slice a data frame by group from the first row (it always starts with the same value) till (and including) the first different value.

I though about using slice(1:min(which == new.value)), but there are groups where this switch does not happen - and this is what causes me headache. I could split the data into those groups where there is a switch and not and do the calculation on only those with a switch - but I would love to know if there are somewhat more elegant options out there. I am open for any package out there.

library(dplyr)

mydf <- data.frame(group = rep(letters[1:3], each = 4), value = c(1,2,2,2, 1, 1,1,1,1,1,2,2))

The following does not work, because there are groups without "switch"

mydf %>% group_by(group) %>% slice(1: min(which(value == 2)))
#> Warning in min(which(value == 2)): no non-missing arguments to min; returning
#> Inf
#> Error in 1:min(which(value == 2)): result would be too long a vector

Doing the slice operation on only the groups with a switch and binding with the "no-switchers" works:

mydf_grouped <- mydf %>% group_by(group) 

mydf_grouped %>% 
  filter(any(value == 2)) %>% 
  slice(1: min(which(value == 2))) %>% 
  bind_rows(filter(mydf_grouped, !any(value ==2)))
#> # A tibble: 9 x 2
#> # Groups:   group [3]
#>   group value
#>   <fct> <dbl>
#> 1 a         1
#> 2 a         2
#> 3 c         1
#> 4 c         1
#> 5 c         2
#> 6 b         1
#> 7 b         1
#> 8 b         1
#> 9 b         1

Created on 2019-12-22 by the reprex package (v0.3.0)


Viewing all articles
Browse latest Browse all 201977

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>