2015-05-18 5 views
3

Я хочу попробовать строки из матрицы, а затем установить все числовых значения в этой отобранной строке 0.R выборки строки из матрицы и установить числовые значения 0

данные

matrix = structure(c('Sp1', 'Sp2', 'Sp3', 'Sp4', 1, 1, 1, 0, 0, 0, 1, 1, 0, 
0, 0, 1), .Dim = c(4L, 4L), .Dimnames = list(NULL, c("", "col1", "col2", "col3"))) 

Calc суммирует

matrix = `colnames<-`(cbind(matrix, rowSums(`class<-`(matrix[,-1], 'numeric'))),c(colnames(matrix), 'Sums')) 

Выход

  col1 col2 col3 Sums 
[1,] "Sp1" "1" "0" "0" "1" 
[2,] "Sp2" "1" "0" "0" "1" 
[3,] "Sp3" "1" "1" "0" "2" 
[4,] "Sp4" "0" "1" "1" "2" 

Итак, он создает матрицу, затем вычисляет суммы. Теперь я хочу, чтобы он пробовал случайную строку, задал все значения в числовой части до 0 и пересчитал суммы.

До сих пор я получил это:

sample <- matrix[sample(nrow(matrix),size=1,replace=FALSE),] 

ответ

2

Я сделал бы это, либо преобразования в «data.frame» или используя первый столбец как rownames сохранить матрицу в числовой. Если у вас есть несколько классов в наборе данных, было бы лучше иметь «data.frame», потому что «матрица» может иметь только один класс. Даже если есть один элемент, который является символом, вся матрица будет преобразована в класс 'character'. В приведенном ниже примере матрица создается с помощью «sps» в качестве имен строк. Делая это, мы можем сделать код простым, а не преобразовывать обратно в «числовой».

m1 <- matrix(c(1,1,1,0, 0, 0, 1, 1, 0, 0,0, 1), nrow=4, ncol=3, 
     dimnames=list(paste0('sp', 1:4), paste0('col', 1:3))) 
m2 <- cbind(m1, Sums=rowSums(m1)) 

m1[sample(nrow(m1), 1, replace=FALSE),] <- 0 
cbind(m1, Sums=rowSums(m1)) 

Или элегантный вариант предложенный @nicola

m2*sample(c(rep(1,nrow(m2)-1),0)) 

О имени объекта как 'матрица',

library(fortunes) 
fortune('dog') 

Во-первых, не называйте вашу матрицу матрицы» ». Вы бы назвали собаку своей собакой? В любом случае, он может столкнуться с функцией «matrix». - Барри Rowlingson R-помощь (октябрь 2004)

+3

+1, особенно для объяснения, почему он должен использовать имена строк. Во всяком случае, другим решением может быть образец 'm2 * (c (rep (1, nrow (m2) -1), 0))'. – nicola

+1

@nicola Спасибо, код выборки элегантный – akrun

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