2016-10-14 4 views
2

Я следующий списокКак использовать образец внутри IfElse

x = rep("a", 100) 

и если я использовал следующую таблицу

ifelse(x == "a", sample(c(1:100), 1), 0) 

я получаю следующий вывод, когда я запускаю первый раз.

[1] 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 
[22] 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 
[43] 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 
[64] 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 
[85] 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 

Я не могу видеть случайный образец между 1 и 100. Как мне его достичь. Я хочу случайность в выходе. Пример ожидаемых результатов заключается в следующем:

[1] 8 81 46 71 97 18 37 82 74 34 12 5 26 6 66 55 
[17] 2 84 68 9 29 7 38 4 64 90 39 54 75 45 20 42 
[33] 79 36 78 13 47 85 27 69 23 62 15 63 76 25 77 96 
[49] 98 11 53 83 30 41 91 43 88 28 65 10 49 99 56 67 
[65] 16 95 32 92 14 86 50 80 94 58 21 87 51 17 70 1 
[81] 33 57 59 73 52 22 31 44 100 61 60 35 89 24 48 72 
[97] 40 19 3 93 
+1

Ваш «х» все «а», почему вам нужно 'ifelse', а не просто делать' образец (100) ' – akrun

+0

Как вы пришли к ожидаемому результату? – zx8754

+0

@akrun Я думаю, что у него может быть плохой пример. Его фактические данные могут не содержать всех «а». – parksw3

ответ

1

Как указано выше, ваш sample генерирует только одно число. Чтобы это исправить ваши ifelse должно быть, выглядит так:

x = rep("a", 100) 
ifelse(x == "a", sample(c(1:100), length(x)), 0) 

или, если я правильно понимаю, что вы хотите, даже сокращенный вариант:

x = rep("a", 100) 
ifelse(x == "a", sample(length(x)), 0) 

Если вы хотите заменить «не» значения с отбором проб с заменой (каждый номер может происходит несколько раз), мы, наконец, получить этот код:

x = rep(c("a","b"), 50) 
ifelse(x == "a", sample(length(x), replace = TRUE), 0) 
2

Подозреваю ifelse работает sample() только один раз и возвращает это случайное значение для каждого элемента, где условие истинно. Вы можете использовать вместо

sapply(x,function(y){ 
    ifelse(y == "a", sample(c(1:100), 1), 0) 
}) 
+0

Ваше подозрение подтверждается 'sample (c (1: 100), 1)' Второй 1 говорит, что он запускается только один раз –

+0

Конечно, 'sample (c (1: 100), 1)' будет возвращать только одно значение. Вопрос здесь состоял в том, что if ifsese снова запустит команду 'sample (c (1: 100), 1)' для каждого элемента, где условие TRUE - похоже, не так. –

+3

Строка 23 в 'head (ifelse, 9999)' показывает, что она запускается только один раз и перерабатывается (реплицируется). –

0

Я пытался интерпретировать ваш вопрос:

x <- sample(c("a", "b"), 100, replace = TRUE) 
res <- rep(0, length(x)) 
res[which(x == "a")] <- sample(length(x), sum(x == "a"), rep = TRUE) 

Глядя на ifelse(x == "a", sample(c(1:100), 1), 0), я предполагаю, что вы хотите сделать это:

for(i in 1:length(x)){res[i] <- ifelse(x[i] == "a", sample(100, 1), 0)} 

Поэтому казалось, что нужно было rep = TRUE. Кроме того, x == "a" возвращает вектор TRUE/FALSE, но он также может быть преобразован в числовой вектор на as.numeric(x == "a") для возврата 1/0. Использование sum без as.numeric по-прежнему работает и вернет ряд элементов в x, что равно a.

Смежные вопросы