2013-03-04 3 views
3

Я использую r-матрицу (например, [[0,0,0,1],[0,1,0,1],[1,0,0,0],[0,0,1,1]]), представляющую растра. Я хотел бы заменить каждое значение, кроме 0, значением его строки. Есть ли что-то вродеЗамена значений строк в матрице индексом строки

matrix[matrix==1] <- row_index 

так, что мой результат будет выглядеть [[0,0,0,1],[0,2,0,2],[3,0,0,0],[0,0,4,4]]?

Я использую R 2.15.1 на Mac (10.7.5) и RPY2 2.2.6 для запуска R-методов. Или есть ли другой способ получить разумные результаты для статистических функций, таких как histogram, chi_square и т. Д.?

ответ

2

Надеется, весь ад не сорвется, предложившей для цикла, но мы увидим:

Вот вашей матрица

mymat <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1), 
       nrow = 4, byrow = TRUE) 
mymat 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 0 1 
# [2,] 0 1 0 1 
# [3,] 1 0 0 0 
# [4,] 0 0 1 1 

Вот цикл, который использует основные Подменит для выявления случаев вы хотите заменить.

for (i in 1:nrow(mymat)) { 
    mymat[i, ][mymat[i, ] != 0] <- i 
} 

Вот результат.

mymat 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 0 1 
# [2,] 0 2 0 2 
# [3,] 3 0 0 0 
# [4,] 0 0 4 4 
5

Для емкого, выразительного решения, я бы, вероятно, использовать это:

m <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1), 
      nrow = 4, byrow = TRUE) 

m[m!=0] <- row(m)[m!=0] 
m 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 0 1 
# [2,] 0 2 0 2 
# [3,] 3 0 0 0 
# [4,] 0 0 4 4 
+0

Я пытался с 'which (m == 1) %% 4' и был пронизан заменой' 0' на '4' (точно делящиеся числа на 4). Это великолепно! Надо помнить 'row' .. – Arun

+1

@Arun - Я чувствую тебя. Мне потребовалось слишком много времени, чтобы узнать об этих трех супер-полезных и связанных заклинаниях: 'm <- diag (3); ряд (м); Col (м); который (m == 1, arr.ind = TRUE) '! –

+0

Хех. Я даже не знал о 'row'. Ницца. – A5C1D2H2I1M1N2O1R2T1

0

Может быть, я пропускаю точку вашего вопроса, но как насчет

> m <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1), 
+    nrow = 4, byrow = TRUE) 
> m * 1:nrow(m) 
    [,1] [,2] [,3] [,4] 
[1,] 0 0 0 1 
[2,] 0 2 0 2 
[3,] 3 0 0 0 
[4,] 0 0 4 4 
> 

(ETA: R заполняет матрицы по столбцу, а оператор itemwise-product делает две соответствующие матрицы совместимыми, копируя их по столбцу до тех пор, пока они не подойдут. Оператор * здесь завершает умножение каждого элемента на строку до который он принадлежит.)