R从矩阵中采样行并将数值设置为0

R sample row from matrix and set numeric values to 0

我想从矩阵中采样一行,然后将该采样行中的所有 numeric 值设置为 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")))

计算总和

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),]

我会通过转换为 'data.frame' 或使用第一列作为行名来将矩阵保持为数字来完成此操作。如果数据集中有多个 class,最好有 'data.frame',因为 'matrix' 只能有一个 class。即使有一个元素是字符,整个矩阵也会被转换为'character' class。在下面的示例中,创建了一个矩阵,其中 'sps' 作为行名称。通过这样做,我们可以使代码变得简单而不是转换回 'numeric'.

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

关于将对象命名为'matrix',

library(fortunes)
fortune('dog')

Firstly, don't call your matrix 'matrix'. Would you call your dog 'dog'? Anyway, it might clash with the function 'matrix'. -- Barry Rowlingson R-help (October 2004)