2014-02-13 33 views
1

假設我有一個包含矢量數據:採樣和更換載體的隨機元素,有條件

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

我需要做的是選擇一個號碼0的,把它們變成1的。可能有很多種方法可以做到這一點 - 比如如果我切換25中的0,就會選擇75,所以5.26x10^19 - 所以我需要隨機地做1000次。 (這是一個更大的模型的一部分,我將使用結果的平均值。)

我知道(想),我需要使用sample()和for循環 - 但是如何選擇n在0之間隨機取值,然後將它們改爲1?

+2

你真的不應該使用'c'作爲變量名稱,因爲它也是最常用函數的名稱。 – Gregor

回答

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 

你可以在一開始大如你想擴展的常量。