1

次のコードで作成されたマトリックスに似たものからサンプリングしようとしています:

    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

目標は、各行から 2 つの項目をサンプリングすることですが、それらのエントリのみが 1 に等しくなり、残りの行には 0 を割り当てます。期待される結果の 1 つとして、次のようなものがあります。

    #      [,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
4

1 に答える 1

1

を使用した 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
}))

行が 2 つ未満の場合はエラーになります1。これがその特定のケースを処理したい方法ではないかどうかを明確にしてください.

于 2013-06-20T14:33:34.163 に答える