假设我有一个包含数据的向量:
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?
答案 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
您可以根据需要将开头的常量放大。