Lukas
Lukas

Reputation: 727

split dataframe by row number in R

This is probably really simple, but I can't find a solution:

df <- data.frame(replicate(10,sample(0:1,10,rep=TRUE)))

v <- c(3, 7)

is there an elegant way to split this dataframe in three elements (of a list) at the row number specified in v?

Upvotes: 8

Views: 10090

Answers (2)

Matthew Plourde
Matthew Plourde

Reputation: 44614

Another way:

split(df, findInterval(1:nrow(df), v))

For the alternative interpretation, you can use:

split(df, cut(1:nrow(df), unique(c(1, v, nrow(df))), include.lowest=TRUE))

Upvotes: 7

akrun
akrun

Reputation: 886938

Assuming that rows 1&2 goes in the first split, 3,4,5,6 in the second and 7 to nrow(df) goes in the last

 split(df, cumsum(1:nrow(df) %in% v))

but if 1:3 rows are in the first split, then comes 4:7, and in the third 8 to nrow(df)

  split(df, cumsum(c(TRUE,(1:nrow(df) %in% v)[-nrow(df)])) )

Or as @James mentioned in the comments,

  split(df, cumsum(1:nrow(df) %in% (v+1)))

Upvotes: 12

Related Questions