поменять местами нули в R - PullRequest
       4

поменять местами нули в R

0 голосов
/ 02 декабря 2011

У меня есть вектор A, который содержит нули и единицы. Я хотел бы случайным образом изменить n процентов из них на ноль. Это лучший способ сделать это в R (изменение 10%):

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 02 декабря 2011

Вы можете сделать это без использования циклов 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

Другой момент, на который следует обратить внимание, заключается в том, что вам не нужно делать ничего особенного для значений A, которые фактически равны 0, поскольку вероятность изменения 1 в 0 по-прежнему равна 0,1.

Как указывает Хэдли, ваш код не меняет случайным образом 10% от 1 до 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
0 голосов
/ 02 декабря 2011

Вы можете векторизовать это:

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

НТН

0 голосов
/ 02 декабря 2011

Если это ваш A:

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

Это должно сделать это:

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

где n - это процент ваших 1, которые вы хотите изменить на 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...