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