2

我有一个数据集 (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 
}

如果有更快的方法可以做到这一点,请帮助我。谢谢。

4

3 回答 3

4

您可以轻松地列出要在大矩阵中分配值为 1 的行,使用applyon x withseq.int来获取这样的行号...

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
于 2013-03-26T23:29:49.467 回答
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]
于 2013-03-27T03:32:51.930 回答
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 早期的贡献略有不同。)

于 2013-03-26T23:39:51.227 回答