有条件地采样和替换矢量的随机元素

时间:2014-02-13 23:56:52

标签: r

假设我有一个包含数据的向量:

c <- c(1:100)
c[1:75] <- 0
c[76:100] <- 1

我需要做的是选择0的数字并将它们变成1。有很多方法可以做到这一点 - 比如如果我正在切换0的25,那么75选择25,所以5.26x10 ^ 19 - 所以我需要随机做1000次。 (这是较大型号的一部分。我将使用结果的平均值。)

我知道(想想)我需要使用sample()和for循环 - 但是如何在0中随机选择n个值,然后将它们更改为1?

1 个答案:

答案 0 :(得分:1)

vec <- c(rep(0, 75), rep(1, 25))

n <- 25
to_change <- sample(which(vec == 0), n)
modified_vec <- vec
modified_vec[to_change] <- 1

像这样的东西。你可以将它包装在一个函数中。

你应该在apply的矩阵中进行,而不是for循环。

这个小例子很容易看出它的工作原理:

n_vecs <- 5
vec_length <- 10
n_0 <- 7 # Number of 0's at the start of each vector

vec_mat <- matrix(c(rep(0, n_vecs * n_0), rep(1, n_vecs * (vec_length - n_0))),
                    nrow = vec_length, ncol = n_vecs, byrow = T)

> vec_mat
      [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    0    0
 [2,]    0    0    0    0    0
 [3,]    0    0    0    0    0
 [4,]    0    0    0    0    0
 [5,]    0    0    0    0    0
 [6,]    0    0    0    0    0
 [7,]    0    0    0    0    0
 [8,]    1    1    1    1    1
 [9,]    1    1    1    1    1
[10,]    1    1    1    1    1

change_n_0 <- function(x, n) {
    x_change <- sample(which(x == 0), n)
    x[x_change] <- 1
    return(x)
}

vec_mat <- apply(vec_mat, MARGIN = 2, FUN = change_n_0, n = 2)

> vec_mat
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    1    0    0    1
 [2,]    0    0    0    1    0
 [3,]    0    0    0    0    0
 [4,]    0    0    0    0    0
 [5,]    0    0    1    0    1
 [6,]    0    1    0    1    0
 [7,]    1    0    1    0    0
 [8,]    1    1    1    1    1
 [9,]    1    1    1    1    1
[10,]    1    1    1    1    1

您可以根据需要将开头的常量放大。