首页 > 解决方案 > R在data.table中查找区间

问题描述

我想按组添加一个带有间隔或断点的新列。举个例子:

这是我的数据表:

x <- data.table(a = c(1:8,1:8), b = c(rep("A",8),rep("B",8)))

我已经有断点或行索引:

pos <- data.table(b =  c("A","A","B","B"), bp = c(3,5,2,4))

在这里我可以找到组“A”的间隔:

findInterval(1:nrow(x[b=="A"]), pos[b=="A"]$bp)

我怎样才能为每个组做到这一点。在这种情况下“A”和“B”?

标签: r

解决方案


一个选项是split通过'b'列对数据集,Map用于循环对应list的s,并应用findInterval

Map(function(u, v) findInterval(seq_len(nrow(u)), v$bp), 
      split(x, x$b), split(pos, pos$b))
#$A
#[1] 0 0 1 1 2 2 2 2

#$B
#[1] 0 1 1 2 2 2 2 2

或另一种选择是从“x”中按“b”分组,然后findInterval通过使用基于创建的逻辑条件进行过滤,将“bp”从“pos”子集化来使用 .BY

x[, findInterval(seq_len(.N), pos$bp[pos$b==.BY]), b]
#    b V1
# 1: A  0
# 2: A  0
# 3: A  1
# 4: A  1
# 5: A  2
# 6: A  2
# 7: A  2
# 8: A  2
# 9: B  0
#10: B  1
#11: B  1
#12: B  2
#13: B  2
#14: B  2
#15: B  2
#16: B  2

推荐阅读