2013-03-26 6 views
2

У меня есть набор данных (х) содержитОбъединение индекса матрицы в R

1 10 
20 30 
34 38 
59 83 
... 

У меня есть большая матрица nx1. Я хочу присвоить значение 1 для каждой строки в x. Например

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

Вы можете легко составить список строк, которые вы хотите присвоить значение 1 в вашей большой матрице, используя apply по й с 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 
+0

Очки для чтения на вопрос лучше, чем я, и для демонстрации того, как использовать индексацию рентабельно. –

+0

@DWin lol, спасибо! :-) –

+0

+1 - альтернативой для строк является 'unlist (mapply (seq, x [, 1], x [, 2]))'. – flodel

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 в.)

+0

+1 Ницца. Мне нравятся примеры «mapply». –

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] 
Смежные вопросы