Получение строк во фрейме данных на основе нескольких диапазонов в R - PullRequest
5 голосов
/ 16 апреля 2020

Допустим, у меня есть эта таблица

   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

Также другая таблица с диапазонами индексов:

  start end
1     2   3
2     5   7

Я хочу получить строки в первой таблице на основе диапазонов индекса в вторая таблица с именем группы для дифференциации, примерно так:

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

как мне добиться этого в R?

Ответы [ 2 ]

5 голосов
/ 16 апреля 2020

Мы можем задать подмножество df1, взяв значение индекса строки из df2, используя Map.

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

Или в 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

данные

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))
0 голосов
/ 16 апреля 2020

Опция, использующая data.table:

DT1[, rn := .I]
DT2[, g := .I]

DT1[, g := DT2[DT1, on=.(start<=rn, end>=rn), x.g]][
    !is.na(g)]

Выход:

    a  b rn g
1:  6 17  2 1
2:  7 28  3 1
3:  9 17  5 2
4: 10 28  6 2
5: 15 12  7 2

данные:

library(data.table)
DT1 <- fread("a  b
5 12
6 17
7 28
8 12
9 17
10 28
15 12
25 14
13 29")

DT2 <- fread("start end
2 3
5 7")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...