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を割り当てたい行のリストを簡単に作成できます。このように、 applyxを使用しseq.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

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 に答える
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 に答える