Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting rows in data frame based on mutiple ranges in R

Tags:

r

Let's say I have this table

   a  b
1  5 12
2  6 17
3  7 28
4  8 12
5  9 17
6 10 28
7 15 12
8 25 14
9 13 29

Also another table with index ranges:

  start end
1     2   3
2     5   7

I want to get the rows in the first table based on the index ranges in the second table with a group name to differentiate, something like this:

   a  b  group
2  6  17  1
3  7  28  1
5  9  17  2
6  10 28  2
7  15 12  2

how do I achieve this in R?

like image 499
Algorithman Avatar asked Apr 16 '20 05:04

Algorithman


1 Answers

We can subset df1 taking the row index value from df2 using Map.

do.call(rbind, Map(function(x, y, z) transform(df1[x:y, ], group = z), 
               df2$start, df2$end, seq_len(nrow(df2))))

Or in purrr :

purrr::map2_dfr(df2$start, df2$end, ~df1[.x:.y, ], .id = "group")


#  group  a  b
#1     1  6 17
#2     1  7 28
#3     2  9 17
#4     2 10 28
#5     2 15 12

data

df1 <- structure(list(a = c(5L, 6L, 7L, 8L, 9L, 10L, 15L, 25L, 13L), 
b = c(12L, 17L, 28L, 12L, 17L, 28L, 12L, 14L, 29L)), 
class = "data.frame", row.names = c(NA, -9L))

df2 <- structure(list(start = c(2L, 5L), end = c(3L, 7L)), 
class = "data.frame", row.names = c(NA, -2L))
like image 167
Ronak Shah Avatar answered Sep 18 '22 13:09

Ronak Shah