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