检查一个数字落在哪个范围并返回一个具有相应移位的新列

时间:2015-12-04 21:10:37

标签: r data.table iranges

我有两个数据帧ch和shift。在数据框中,我有一个名称为pos的列,其中包含如下所示的数字。 在数据框移位中,我有三列,名称为shft,start和end。

ch <- structure(list(pos = c(3.25, 3.75, 4.25, 4.75, 5.25, 5.75, 6.25, 
6.75, 7.25, 7.75, 0.25, 0.75, 1.25, 1.75, 2.25, 2.75, 3.25, 3.75, 
4.25, 4.75, 5.25, 5.75, 6.25, 6.75, 7.25, 7.75, 0.25, 0.75, 1.25, 
1.75, 2.25)), .Names = "pos", row.names = c(NA, -31L), class = "data.frame")

head(ch)
   pos
1 3.25
2 3.75
3 4.25
4 4.75
5 5.25
6 5.75

shift <- structure(list(shift = structure(c(2L, 3L, 2L, 4L, 3L, 4L, 3L, 
1L, 4L, 1L, 4L, 2L, 1L, 2L, 1L, 3L, 2L), .Label = c("A", "B", 
"C", "D"), class = "factor"), start = c(0, 0.25, 0.75, 1.25, 
1.75, 2.25, 2.75, 3.25, 3.75, 4.25, 4.75, 5.25, 5.75, 6.25, 6.75, 
7.25, 7.75), end = c(0.25, 0.75, 1.25, 1.75, 2.25, 2.75, 3.25, 
3.75, 4.25, 4.75, 5.25, 5.75, 6.25, 6.75, 7.25, 7.75, 8)), .Names = c("shft", 
"start", "end"), class = "data.frame", row.names = c(NA, -17L
))

头(移位)

   shft  start end
1     B  0.00 0.25
2     C  0.25 0.75
3     B  0.75 1.25
4     D  1.25 1.75
5     C  1.75 2.25
6     D  2.25 2.75

我想检查ch数据帧中pos列的每个数字,其中列出了移位数据帧的开始和结束列,并且必须在列中分配相应的shft,例如A,B,C,D名字转移。

比较必须与>= start and < end相似。

通过查看stackoverflow上的一个问题,我找到了一个解决方案,但它的工作方式就像在哪个范围内值会下降

library(data.table)
T1 <- data.table(ch)
T2 <- data.table(shift)
setkey(T2, start, end)
T1[, c("start", "end") := pos] 
foverlaps(T1, T2)

使用上面的命令行,结果类似于0.25,我将获得一个带有shift B的行和一个带有shift c的行。在我的数据帧中,我有31行,在结果上面的脚本之后,我有62行。

有些人可以告诉我如何执行比较(>= start and < end)而不仅仅是降低范围。实际上数据帧ch将不仅包括我所显示的数字,如0.25,3.25,7.25,还包括3.14,0.89,7.25,6.93,5,46。

1 个答案:

答案 0 :(得分:1)

鉴于您的所有分区都重叠: 编辑:我意识到你现在想要&gt; =开始,而不是&lt; = end,这是一个简单的修复,cut right = FALSE

基地R:

ch$shift <- cut(ch$pos,breaks = c(0,shift$end),labels = shift$shft, right = FALSE)

使用dplyr:

ch <- ch %>% mutate(shift = cut(pos,breaks = c(0,shift$end),labels = shift$shft, right = FALSE))