【问题标题】:Conditional sampling in each row of a matrix using R使用 R 在矩阵的每一行中进行条件采样
【发布时间】:2013-06-20 14:16:12
【问题描述】:

我正在尝试从类似于由以下代码创建的矩阵中进行采样:

    set.seed(17)
    x = sample(0:1, 100, replace=T)
    x = matrix(x, 20)
    xrowsum = apply(x, 1, sum)
    x = x[xrowsum > 2, ]
    x
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    0    1    1    0    1
    # [2,]    1    1    1    1    0
    # [3,]    1    1    1    0    1
    # [4,]    0    1    1    0    1
    # [5,]    0    1    1    0    1
    # [6,]    1    1    0    0    1
    # [7,]    1    1    1    0    1
    # [8,]    1    1    1    0    0
    # [9,]    1    0    1    1    1
    #[10,]    1    1    1    1    1
    #[11,]    1    1    0    1    1

我们的目标是从每行中抽取两个项目,但只对那些等于 1 的项目进行抽样,并将 0 分配给该行的其余部分。一个预期结果可能如下所示。

    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    0    1    1    0    0
    # [2,]    1    0    0    1    0
    # [3,]    1    0    0    0    1
    # [4,]    0    1    0    0    1
    # [5,]    0    1    0    0    1
    # [6,]    0    1    0    0    1
    # [7,]    0    1    1    0    0
    # [8,]    1    0    1    0    0
    # [9,]    1    0    0    1    0
    #[10,]    0    0    1    1    0
    #[11,]    0    1    0    0    1

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    使用apply 的一种解决方案。

    t(apply(x, 1, function(row) {
       out <- rep(0, length(row))
       one.idx <- which(row == 1)
       stopifnot(length(one.idx) >= 2)
       keep.idx <- sample(one.idx, 2)
       out[keep.idx] <- 1
       out
    }))
    

    如果一行少于两个1,则会出错。请澄清这是否不是您想要处理该特定情况的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2021-11-02
      相关资源
      最近更新 更多