我有一个数据集(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
}
如果有更快的方法,请帮助我。感谢。
答案 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]