0

我有两个数据框 ch 和 shift。在数据框 ch 我有一个名为 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 列中的每个数字,其范围列在 shift 数据帧的 start 和 end 列中,并且必须在名称 shift 的列中分配相应的 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。

4

1 回答 1

1

鉴于您的所有分区都重叠:编辑:我现在意识到您想要 >= start,而不是 <= 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))
于 2015-12-04T21:25:21.950 回答