我有一个位置矢量(感兴趣的人在基因组中的碱基对),我正在尝试识别该矢量中位于给定距离阈值之下的位置簇。
因此,使用一个简单的例子,我想识别此向量中位置之间的距离小于20的位置
bp = c(1, 20, 30, 100, 400, 410, 430, 500, 590, 690)
到目前为止,我这样做了:
d <- 20
sapply(1:length(bp), function(z){
(bp[z + 1] - bp[z]) <= d
})
其中d是距离阈值。这给了我一个像这样的逻辑向量:
[1] TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE NA
我想要的是将这些连续的'TRUE'值标识为簇,并分别命名所有其他位置。基本上我想以下面的data.frame结束:
bp cluster
1 1 a
2 20 a
3 30 a
4 100 b
5 400 c
6 410 c
7 430 c
8 500 d
9 590 e
10 690 f
非常感谢任何建议。
答案 0 :(得分:2)
这是一个矢量化尝试,但是如果组太多,你可能会没有字母,所以你可能只是坚持使用数字值(删除data.frame(bp, cluster = letters[cumsum(c(1L, diff(bp) > 20L))])
# bp cluster
# 1 1 a
# 2 20 a
# 3 30 a
# 4 100 b
# 5 400 c
# 6 410 c
# 7 430 c
# 8 500 d
# 9 590 e
# 10 690 f
部分)
ksession.getAgenda().getAgendaGroup("ruleflow-group name").setFocus();
// start the process - ruleflow is .rf file
ksession.startProcess("com.sample.ruleflow");
答案 1 :(得分:0)
一种糟糕的勒芒方法是for循环......
a <- diff(bp) < 20
b <- 1
d <- c()
for(l in a) {
if(l) {
d <- c(d, b)
} else{
b <- b + 1
d <- c(d, b)
}
}
答案 2 :(得分:0)
使用数字组而不是a-h组。但是你可以把它转换成那种方式。
bp = c(1, 20, 30, 100, 400, 410, 430, 500, 590, 690)
f <- sapply(1:length(bp), function(z){ as.integer((bp[z] + d - 1) / d) })
data.frame(bp,cluster = f)