R矩阵中的样本行,并将数值设置为0

时间:2015-05-18 11:12:53

标签: r matrix sample

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

1 个答案:

答案 0 :(得分:2)

我会通过转换为&#39; data.frame&#39;来完成此操作。或使用第一列作为rownames将矩阵保持为数字。如果数据集中有多个类,那么最好使用&data; data.frame&#39;因为&#39;矩阵&#39;只能有一个班级。即使有一个单独的元素是字符,整个矩阵也会被转换为&#39;字符&#39;类。在下面的示例中,使用&#39; sps&#39;创建矩阵。作为行名称。通过这样做,我们可以使代码简单,而不是转换回数字&#39;。

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

关于将对象命名为&#39; matrix&#39;,

library(fortunes)
fortune('dog')
  

首先,不要打电话给你的矩阵&#39;矩阵&#39;。你会打电话给你的狗狗吗?   无论如何,它可能会与函数&#39;矩阵冲突。       - 巴里罗林森         R-help(2004年10月)