R在data.table中查找间隔

R在data.table中查找间隔,r,R,我想按组添加一个具有间隔或断点的新列。例如: 这是我的数据表: x <- data.table(a = c(1:8,1:8), b = c(rep("A",8),rep("B",8))) 我怎样才能为每个小组做到这一点。在这种情况下,“A”和“B”一个选项是按“B”列拆分数据集,使用Map在相应的列表上循环,并应用findInterval Map(function(u, v) findInterval(seq_len(nrow(u)), v$bp), split(x, x$

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

这是我的数据表:

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

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

一个选项是
按“B”列拆分数据集,使用
Map
在相应的
列表上循环,并应用
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
,通过使用基于
.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

数据中使用滚动联接的另一个选项。表

pos[, ri := rowid(b)]
x[, intvl := fcoalesce(pos[x, on=.(b, bp=a), roll=Inf, ri], 0L)]
输出:

    a b intvl
 1: 1 A     0
 2: 2 A     0
 3: 3 A     1
 4: 4 A     1
 5: 5 A     2
 6: 6 A     2
 7: 7 A     2
 8: 8 A     2
 9: 1 B     0
10: 2 B     1
11: 3 B     1
12: 4 B     2
13: 5 B     2
14: 6 B     2
15: 7 B     2
16: 8 B     2

我们可以通过
b
pos
数据
嵌套到列表中,并与
x
连接,使用
findInterval
得到相应的组

library(dplyr)

pos %>% 
   tidyr::nest(data = bp) %>%
   right_join(x, by = 'b') %>%
   group_by(b) %>%
   mutate(interval = findInterval(a, data[[1]][[1]])) %>%
   select(-data)

#    b        a interval
#   <chr> <int>    <int>
# 1 A         1        0
# 2 A         2        0
# 3 A         3        1
# 4 A         4        1
# 5 A         5        2
# 6 A         6        2
# 7 A         7        2
# 8 A         8        2
# 9 B         1        0
#10 B         2        1
#11 B         3        1
#12 B         4        2
#13 B         5        2
#14 B         6        2
#15 B         7        2
#16 B         8        2
库(dplyr)
pos%>%
tidyr::nest(数据=bp)%>%
右联合(x,by='b')%>%
组别(b)%>%
变异(区间=findInterval(a,数据[[1]][[1]]))%>%
选择(-数据)
#b间歇
#        
#1A 10
#2 A 2 0
#3 A 3 1
#4 A 4 1
#5 A 5 2
#6 A 6 2
#7 A 7 2
#8 A 8 2
#9b10
#10B21
#11 B 3 1
#12 B 4 2
#13 B 5 2
#14 B 6 2
#15 B 7 2
#16 B 8 2
    a b intvl
 1: 1 A     0
 2: 2 A     0
 3: 3 A     1
 4: 4 A     1
 5: 5 A     2
 6: 6 A     2
 7: 7 A     2
 8: 8 A     2
 9: 1 B     0
10: 2 B     1
11: 3 B     1
12: 4 B     2
13: 5 B     2
14: 6 B     2
15: 7 B     2
16: 8 B     2
library(dplyr)

pos %>% 
   tidyr::nest(data = bp) %>%
   right_join(x, by = 'b') %>%
   group_by(b) %>%
   mutate(interval = findInterval(a, data[[1]][[1]])) %>%
   select(-data)

#    b        a interval
#   <chr> <int>    <int>
# 1 A         1        0
# 2 A         2        0
# 3 A         3        1
# 4 A         4        1
# 5 A         5        2
# 6 A         6        2
# 7 A         7        2
# 8 A         8        2
# 9 B         1        0
#10 B         2        1
#11 B         3        1
#12 B         4        2
#13 B         5        2
#14 B         6        2
#15 B         7        2
#16 B         8        2