将数据帧剪切为长度为1的间隔

时间:2016-03-23 10:57:44

标签: r dplyr

我有一个这样的数据框:

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

我现在希望它延伸到长度为1的间隔(由开始,结束定义)。它应该是这样的:

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解决方案,如果可能的话

1 个答案:

答案 0 :(得分: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)