2014-10-09 4 views
0

У меня есть матрица (expTrans), которая в настоящее время заполняется нулями. У меня есть вторая матрица (expCoor), где второй столбец заполняется именами столбцов, а третий столбец заполняется номерами строк. Я хочу использовать координаты во второй матрице, чтобы изменить некоторые элементы в первой матрице на 1. Когда я использую этот код, R заполняет каждую строку, указанную в каждой колонке, упомянутой с 1 (столбцы выходят идентичны):R: Доступ к элементам матрицы с использованием отдельной матрицы координат

expTrans<-matrix(0, nrow(cashflows), ncol(dmat)) 
colnames(expTrans)<-substr(colnames(dmat),4,6) 
expTrans[expCoor[,3],colnames(expenses)[expCoor[,1]]]<-1 

Есть ли способ изменить только строку и столбец, указанную каждой координатой, не имея для петли всей матрицы?

Вот простой пример, чтобы проиллюстрировать, что я имею в виду:

> m<-matrix(0,ncol=10,nrow=10) 
> colnames(m)<-c("a","b","c","d","e","f","g","h","i","j") 
> m 
     a b c d e f g h i j 
[1,] 0 0 0 0 0 0 0 0 0 0 
[2,] 0 0 0 0 0 0 0 0 0 0 
[3,] 0 0 0 0 0 0 0 0 0 0 
[4,] 0 0 0 0 0 0 0 0 0 0 
[5,] 0 0 0 0 0 0 0 0 0 0 
[6,] 0 0 0 0 0 0 0 0 0 0 
[7,] 0 0 0 0 0 0 0 0 0 0 
[8,] 0 0 0 0 0 0 0 0 0 0 
[9,] 0 0 0 0 0 0 0 0 0 0 
[10,] 0 0 0 0 0 0 0 0 0 0 
> ind<-cbind(sample(1:10,10),sample(1:10,10), c("a","a","b","j","c","d","e", "a", "b", "b")) 
> ind 
     [,1] [,2] [,3] 
[1,] "4" "8" "a" 
[2,] "2" "9" "a" 
[3,] "9" "3" "b" 
[4,] "3" "1" "j" 
[5,] "7" "4" "c" 
[6,] "10" "7" "d" 
[7,] "8" "6" "e" 
[8,] "1" "2" "a" 
[9,] "6" "5" "b" 
[10,] "5" "10" "b" 
> m[as.numeric(ind[,1]),ind[,3]]<-1 
> m 
     a b c d e f g h i j 
[1,] 1 1 1 1 1 0 0 0 0 1 
[2,] 1 1 1 1 1 0 0 0 0 1 
[3,] 1 1 1 1 1 0 0 0 0 1 
[4,] 1 1 1 1 1 0 0 0 0 1 
[5,] 1 1 1 1 1 0 0 0 0 1 
[6,] 1 1 1 1 1 0 0 0 0 1 
[7,] 1 1 1 1 1 0 0 0 0 1 
[8,] 1 1 1 1 1 0 0 0 0 1 
[9,] 1 1 1 1 1 0 0 0 0 1 
[10,] 1 1 1 1 1 0 0 0 0 1 

я ожидал колонка А иметь 3 1s (строки 4,2,8), столбец В, чтобы иметь 3 1s (строки 9 , 6,5), столбец c имеет 1 1 (строка 7), столбец d, чтобы иметь 1 1 (строка 10), столбец e, чтобы иметь 1 1 (строка 8) и столбец j, чтобы иметь 1 1 (строка 3).

+0

Можете ли вы предоставить упрощенный пример ваших данных? В настоящий момент у вас есть 'expTrans'' cashflows' 'dmat'' расходы' и 'expCoor'. Все это необходимо для представления вашей проблемы? Я не могу понять, что вы которые вы пытаетесь сделать. – thelatemail

+0

Кроме того, вы говорите, что колонка ** 2nd ** в 'expCoor' содержит имена столбцов. Почему же вы ссылаетесь на' expCoor [, 1] 'вместо' expCoor [, 2] 'в вас r окончательная строка кода для индексации столбцов? – thelatemail

ответ

3

Существует метод использования двухколоночной матрицы для "[" или "[< -". Если вы хотите сделать какое-то поиск для столбца и rownames, что может быть возможно (если и только если вы предоставили соответствующий воспроизводимый пример

> expTrans<-matrix(0, 3,4);expTrans 
    [,1] [,2] [,3] [,4] 
[1,] 0 0 0 0 
[2,] 0 0 0 0 
[3,] 0 0 0 0 
> dmat <- matrix(c(1,3,4,2,2,2),ncol=3, byrow=TRUE);dmat 
    [,1] [,2] [,3] 
[1,] 1 3 4 
[2,] 2 2 2 
> colnames(expTrans)<- colnames(dmat); rownames(expTrans) <-rownames(dmat) 
> expTrans[cbind(dmat[,2],dmat[,3])] <- dmat[,1] 
> expTrans 
    [,1] [,2] [,3] [,4] 
[1,] 0 0 0 0 
[2,] 0 2 0 0 
[3,] 0 0 0 1 
> ?'[' 

Решения исправленного вопрос:.

> m[cbind(as.numeric(ind[,1]), match(ind[,3], colnames(m))) ] <- 1 
> m 
     a b c d e f g h i j 
[1,] 0 1 0 0 0 0 0 0 0 0 
[2,] 0 1 0 0 0 0 0 0 0 0 
[3,] 0 0 0 1 0 0 0 0 0 0 
[4,] 1 0 0 0 0 0 0 0 0 0 
[5,] 0 0 0 0 0 0 0 0 0 1 
[6,] 0 1 0 0 0 0 0 0 0 0 
[7,] 0 0 0 0 1 0 0 0 0 0 
[8,] 1 0 0 0 0 0 0 0 0 0 
[9,] 0 0 1 0 0 0 0 0 0 0 
[10,] 1 0 0 0 0 0 0 0 0 0 
+0

приведен пример выше, спасибо – user3390169

+0

OK. Решение предоставлено. Помните ... _numeric_ –

+0

, который сработал! благодаря! – user3390169

Смежные вопросы