Условно назначить значение случайному подмножеству вектора - PullRequest
0 голосов
/ 18 июня 2019

Я хочу присвоить определенное значение (скажем, 1) случайной выборке подмножества вектора, которое удовлетворяет определенным условиям.Я не могу заставить его работать.

Я пробовал этот код:

a <- c(1:50)
df <- as.data.frame(a)
df$c <- 0 
df$c[sample(x=(df$c[df$a>25]), size = round(NROW(df$c[df$a>25])/5), replace = F)] <- 1

Я хотел бы просто случайным образом сделать некоторые из df$c векторных значений равными 1, точно случайную выборку одной пятойзначения в df$c, в которых значение df$a равно a, больше 25 (это будет 5 наблюдений, переключенных на 1).

Но пока все они остаются 0: /

Спасибо!

Ответы [ 2 ]

5 голосов
/ 18 июня 2019

Вот способ с базой R -

df$c[sample(which(df$a > 25), sum(df$a > 25)/5)] <- 1

Имейте в виду, что это не удастся, если в df$a > 25.

есть только 1 значение.

Подход, описанный ниже, ни в коем случае не потерпит неудачу, но он немного многословен. Не стесняйтесь использовать все, что вам больше подходит, в зависимости от ожидаемых значений в df$a -

df$c[which(df$a > 25)[sample(length(which(df$a > 25)), sum(df$a > 25)/5)]] <- 1

Также обратите внимание, что, поскольку, relace = F, образец size = sum(df$a > 25)/5 должен быть <= length(which(df$a > 25)). Вы можете включить это условие в свой код, если хотите сделать его еще более безопасным.

Кроме того, не будет никаких изменений, если sum(df$a > 25)/5 < 1, поэтому вы можете использовать size = max(sum(df$a > 25)/5, 1), если вы хотите по крайней мере 1 изменение.

Вот лучшая версия моей первой версии, благодаря @Frank -

df$c <- replace(df$c, sample(w <- which(df$a > 25), length(w)*.2), 1)
1 голос
/ 18 июня 2019

Не так элегантно, как у другого решения, которое у вас есть, но есть и другой способ:

df <- data.frame('a' = c(1:50), 'c' = rep(0,50))

df$c[sample(
  # subset to sample
  df$a[df$a > 25], 
  # sample size
  size = round(length(df$a[df$a > 25])/5, 0), 
  # no replacement 
  replace = F)] <- 1

Ваш не сработал, потому что вы выбрали где df$c > 25 вместо df$a

df$c[sample(x=(   df$c   [df$a>25]), size = round(NROW(df$c[df$a>25])/5), replace = F)] <- 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...