2016-03-23 3 views
0

У меня есть кадр данных, как это:вырезать кадр данных на интервалы длины 1

d <- data.frame(start = c(3.2, 7.8, 10.1, 12.1, 14.1, 17.9), 
       end = c(5.6, 8.1, 11.1, 13.6, 16.1, 22.3), 
       v1 = 1:6) 

это выглядит

> d 
    start end v1 
1 3.2 5.6 1 
2 7.8 8.1 2 
3 10.1 11.1 3 
4 12.1 13.6 4 
5 14.1 16.1 5 
6 17.9 22.3 6 

теперь я хочу, чтобы растянуть интервалы времени (определяется началом, конец) длины один. Он должен выглядеть следующим образом:

start end v1 
    3 4 1 
    4 5 1 
    5 6 1 
    7 8 2 
    8 9 2 
    10 11 3 
    11 12 3 
    12 13 4 
    13 14 4 
... 
    22 23 6 

благодаря

Я хотел бы видеть решение dplyr, если это возможно

+0

строки 4 и 5 shou ld будет '7 8' и' 8 9' правильно? –

+0

@PierreLafortune вы правы, извините за путаницу. Я исправил это. – spore234

ответ

3

Вот пример использования data.table::foverlaps:

library(data.table) 
dt1 <- as.data.table(d) 
dt2 <- as.data.table(embed(seq(floor(min(d$start)), ceiling(max(d$end))), 2)[, 2:1])[, .(start=as.numeric(V1), end=as.numeric(V2))] 
setkey(dt2, start, end) 
foverlaps(dt1, dt2)[, -(3:4), with=F] 
    start end v1 
1:  3 4 1 
2:  4 5 1 
3:  5 6 1 
4:  7 8 2 
5:  8 9 2 
6: 10 11 3 
7: 11 12 3 
8: 12 13 4 
9: 13 14 4 
10: 14 15 5 
11: 15 16 5 
12: 16 17 5 
13: 17 18 6 
14: 18 19 6 
15: 19 20 6 
16: 20 21 6 
17: 21 22 6 
18: 22 23 6 

(Или merge(dt2, foverlaps(dt1, dt2)[, -(3:4), with=F], by=c("start", "end"), all.x=TRUE) если вы хотите NA s)

+0

спасибо. Мои данные примера не имеют значения в интервале 6-7, поэтому это должно быть NA, а не 2. Я также исправил желаемый результат, извините за путаницу. – spore234

+0

Преобразование начала и конца в числовое значение должно делать трюк. – lukeA

Смежные вопросы