Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:压缩索引_R - Fatal编程技术网

R:压缩索引

R:压缩索引,r,R,我有一个向量,如下所示: xx <- c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1) 大概是这样的吧 if (xx[1] == 1) { rr <- cumsum(c(0, rle(xx)$lengths)) } else { rr <- cumsum(rle(xx)$lengths) } if (length(rr) %% 2 == 1) { rr <- head(rr, -1) } oo <- m

我有一个向量,如下所示:

xx <- c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1)

大概是这样的吧

if (xx[1] == 1) {
    rr <- cumsum(c(0, rle(xx)$lengths))
} else {
    rr <- cumsum(rle(xx)$lengths)
}
if (length(rr) %% 2 == 1) {
    rr <- head(rr, -1)
}
oo <- matrix(rr, ncol=2, byrow=TRUE)
oo[, 1] <- oo[, 1] + 1
     [,1] [,2]
[1,]    1    6
[2,]   11   14
if(xx[1]==1){

rr因为这个问题最初有一个标签“生物信息学”,我要提到这个软件包(它是基因组范围的伴侣)

其他操作可能在
Rle
上启动,例如

> xx = c(2,2,2,3,3,3,0,0,0,0,4,4,1,1)
> r = Rle(xx)
> m = cbind(start(r), end(r))[runValue(r) != 0,,drop=FALSE]
> m
     [,1] [,2]
[1,]    1    3
[2,]    4    6
[3,]   11   12
[4,]   13   14
查看帮助页面
?Rle
了解
Rle
类的全部灵活性;要从上面的矩阵转到下面的注释中要求的新Rle,可以创建一个适当长度的新Rle,然后使用IRanges作为索引分配子集

> r = Rle(0L, max(m))
> r[IRanges(m[,1], m[,2])] = 1L
> r
integer-Rle of length 14 with 3 runs
  Lengths: 6 4 4
  Values : 1 0 1
我们可以把它扩展成一个完整的向量

> as(r, "integer")
 [1] 1 1 1 1 1 1 0 0 0 0 1 1 1 1
但通常最好继续对Rle进行分析。该类非常灵活,因此从
xx
到1和0的整数向量的一种方法是

> as(Rle(xx) > 0, "integer")
 [1] 1 1 1 1 1 1 0 0 0 0 1 1 1 1
不过,再次强调的是,呆在Rle空间通常是有意义的。而且,对于你的单独问题的答案可能是最好的

性能(速度)很重要,尽管在这种情况下,我认为Rle类提供了很大的灵活性,这会对性能不佳产生不利影响,而对于典型的分析来说,最终出现在矩阵上是不太可能的终点

eddi <- function(xx)
    matrix(which(diff(c(0,xx,0)) != 0) - c(0,1),
           ncol = 2, byrow = TRUE)

iranges = function(xx) {
    sl = slice(Rle(xx), 1)
    matrix(c(start(sl), end(sl)), ncol=2)
}

iranges.1 = function(xx) {
    r = Rle(xx)
    cbind(start(r), end(r))[runValue(r) != 0, , drop=FALSE]
}
另一个简短的例子:

cbind(start = which(diff(c(0, xx)) == +1),
      end   = which(diff(c(xx, 0)) == -1))
#      start end
# [1,]     1   6
# [2,]    11  14
我在一个很长的向量上进行了测试,它比使用
rle
稍微慢一点。但是更具可读性。如果速度确实是一个问题,您还可以:

xx.diff <- diff(c(0, xx, 0))
cbind(start = which(head(xx.diff, -1) == +1),
      end   = which(tail(xx.diff, -1) == -1))
#      start end
# [1,]     1   6
# [2,]    11  14

xx.diff这里是另一个基于其他人想法的解决方案,它稍微短一些,速度更快一些:

matrix(which(diff(c(0,xx,0)) != 0) - c(0,1), ncol = 2, byrow = T)
#     [,1] [,2]
#[1,]    1    6
#[2,]   11   14
我没有测试非基本解决方案,但下面是基本解决方案的比较:

xx = sample(c(0,1), 1e5, T)
microbenchmark(arun(xx), flodel(xx), flodel.fast(xx), eddi(xx))
#Unit: milliseconds
#            expr       min        lq    median        uq       max neval
#        arun(xx) 14.021134 14.181134 14.246415 14.332655 15.220496   100
#      flodel(xx) 12.885134 13.186254 13.248334 13.432974 14.367695   100
# flodel.fast(xx)  9.704010  9.952810 10.063691 10.211371 11.108171   100
#        eddi(xx)  7.029448  7.276008  7.328968  7.439528  8.361609   100

如果我有xx=c(2,2,2,3,3,3,0,0,0,4,4,1,1),我想得到一个4x2矩阵中的13,4,6,11,12和13,14会怎么样?@user1938809我已经把它添加到了响应中。我可以问一下如何从1,3,4,6,11,12和13,14转换成向量形式(1,1,1,1,1,1,0,0,0,0,1,1,1)假设您知道向量大小为14,则不使用任何循环。使用循环速度很慢。谢谢。@user1938809查看帮助页面?Rle了解可以做什么;我为您的特定问题添加了更多内容fwiw我在回答中添加了IRanges计时。很好!这真是令人惊讶
xx.diff <- diff(c(0, xx, 0))
cbind(start = which(head(xx.diff, -1) == +1),
      end   = which(tail(xx.diff, -1) == -1))
#      start end
# [1,]     1   6
# [2,]    11  14
matrix(which(diff(c(0,xx,0)) != 0) - c(0,1), ncol = 2, byrow = T)
#     [,1] [,2]
#[1,]    1    6
#[2,]   11   14
xx = sample(c(0,1), 1e5, T)
microbenchmark(arun(xx), flodel(xx), flodel.fast(xx), eddi(xx))
#Unit: milliseconds
#            expr       min        lq    median        uq       max neval
#        arun(xx) 14.021134 14.181134 14.246415 14.332655 15.220496   100
#      flodel(xx) 12.885134 13.186254 13.248334 13.432974 14.367695   100
# flodel.fast(xx)  9.704010  9.952810 10.063691 10.211371 11.108171   100
#        eddi(xx)  7.029448  7.276008  7.328968  7.439528  8.361609   100