在R中将n%的1交换为0

时间:2011-12-02 12:31:20

标签: r

我有一个包含0和1的向量A.我想随机将n%的百分比改为零。这是在R中做到这一点的最佳方式(10%变化):

for (i in 1:length(A)) 
{
    if(A[i] > 0)
    {
        if(runif(1) <= 0.1)
        {
            A[i] = 0
        }
    }
}

感谢。

3 个答案:

答案 0 :(得分:1)

您可以在不使用for循环和if语句的情况下执行此操作:

##Generate some data
R> A = sample(0:1, 100, replace=TRUE)
##Generate n U(0,1) random numbers
##If any of the U's are less then 0.1
##Set the corresponding value in A to 0
R> A[runif(length(A)) < 0.1] = 0

另一点需要注意的是,对于实际上等于0的A值,你不需要做任何特殊的事情,因为1到0的变化概率仍为0.1。

正如Hadley指出的那样,你的代码不会随机将1的10%变为0.如果这是你的意图,那么:

##Select the rows in A equal to 1
R> rows_with_1 = (1:length(A))[A==1]
##Randomly select a % of these rows and set equal to zero
##Warning: there will likely be some rounding here
R> A[sample(rows_with_1, length(rows_with_1)*0.1)] = 0

答案 1 :(得分:0)

如果这是你的A:

A <- round(rnorm(100, 0.5, 0.1))

这应该这样做:

n <- 10
A[sample(A[A==1], length(A[A==1])*n/100)] <- 0

其中n是您想要更改为0的1的百分比。

答案 2 :(得分:0)

您可以将其矢量化:

A <- round(runif(20), 0)
A[sample(which(A == 1), 0.1 * length(A == 1))] <- 0

HTH