R - 如何识别满足数据帧条件的连续行?

时间:2015-07-16 08:46:09

标签: r

我有一个位置矢量(感兴趣的人在基因组中的碱基对),我正在尝试识别该矢量中位于给定距离阈值之下的位置簇。

因此,使用一个简单的例子,我想识别此向量中位置之间的距离小于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

非常感谢任何建议。

3 个答案:

答案 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)