合并R中的矩阵索引

时间:2013-03-26 23:20:32

标签: r statistics

我有一个数据集(x)包含

 1 10
20 30
34 38
59 83
...

我有一个大矩阵nx1。我想为x中的每一行指定一个值1。例如

mat[1:10,1] = 1 
mat[20:30,1] = 1
etc...

在R中,x的大小相当大,需要一段时间才能执行以下操作:

for ( j in 1:dim(x)[1] ) { 
    mat[x[j,1]:x[j,2], 1] <- 1 
}

如果有更快的方法,请帮助我。感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用apply在x和seq.int上轻松制作要为大矩阵指定值1的行的列表,以获取此行号...

rows <- unlist( apply( x , 1 , FUN = function(x){ seq.int(x[1],x[2])}) )
rows
#  [1]  1  2  3  4  5  6  7  8  9 10 20 21 22 23 24 25 26 27 28 29 30 34 35 36 37 38 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

然后使用更快的子集,比如

mat[ rows , 1 ] <- 1

答案 1 :(得分:1)

如果m是您的开始和停止位置集:

m <-  matrix(scan(), ncol=2)
#------
1: 1 10
3: 20 30
5: 34 38
7: 59 83
9: 
Read 8 items
mapply( seq.int,  m[,1], m[,2])

rx1[ unlist( mapply( seq.int,  m[,1], m[,2]) ), 1] <- 1

(与SimonO101早期的贡献完全不同。)

答案 2 :(得分:1)

data.table通常在这样的情况下表现优异。这是一个基于data.table的解决方案:

library(data.table)
indexes<-data.table(istart=c(1L,20L,34L,59L), istop=c(10L,30L,38L,83L))
mat<-data.table(val=sample(1L:1e5L,1e5))

mat[indexes[,list(i=seq(istart,istop)),by="istart"][,i],val:=1L]