1

I would like to split / group a dataframe df

a <- c(1,2,3,4,5,6,7,8,9,10)
b <- c(10,20,30,40,50,60,70,80,90,100)
c <- c("a","a","b","b","b","a","a","b","c","c")
df <- data.frame(x_value=a, y_value=b, speed=c)

in to separate dataframes on the "speed" column as follows

   x_value y_value speed
1        1      10     a
2        2      20     a
****
3        3      30     b
4        4      40     b
5        5      50     b
****
6        6      60     a
7        7      70     a
****
8        8      80     b
****
9        9      90     c
10      10     100     c

so I end-up with e.g. df[1], holding rows 1 and 2, df[2], holding 3, 4, and 5, etc.

patfee
  • 51
  • 5

1 Answers1

2

We need split with rleid to create a list of data.frames

library(data.table)
lst1 <- split(df, rleid(df$speed))

To extract the data.frames, use [[

lst1[[1]]
lst1[[2]]

Or create a grouping variable from base R

grp <- cumsum(c(TRUE, df$speed[-1] != df$speed[-nrow(df)]))

Or create the grouping variable with rle

grp <- with(rle(as.character(df$speed)), rep(seq_along(values), lengths))
lst1 <- split(df, grp)
akrun
  • 874,273
  • 37
  • 540
  • 662