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