【问题标题】:R sample row from matrix and set numeric values to 0R从矩阵中采样行并将数值设置为0
【发布时间】:2015-05-18 11:12:52
【问题描述】:

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

【问题讨论】:

    标签: r matrix sample


    【解决方案1】:

    我会通过转换为“data.frame”或使用第一列作为行名来将矩阵保持为数字来完成此操作。如果数据集中有多个类,最好有“data.frame”,因为“矩阵”只能有一个类。即使有单个元素是字符,整个矩阵也会转换为“字符”类。在下面的示例中,使用“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')
    

    首先,不要将您的矩阵称为“矩阵”。你会称你的狗为“狗”吗? 无论如何,它可能会与函数“矩阵”发生冲突。 ——巴里·罗林森 R 帮助(2004 年 10 月)

    【讨论】:

    • +1,特别是用于解释为什么他应该使用行名。无论如何,另一个解决方案可能是m2*sample(c(rep(1,nrow(m2)-1),0))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2015-12-26
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多