我有一个包含0和1的向量A.我想随机将n%的百分比改为零。这是在R中做到这一点的最佳方式(10%变化):
for (i in 1:length(A))
{
if(A[i] > 0)
{
if(runif(1) <= 0.1)
{
A[i] = 0
}
}
}
感谢。
答案 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