2013-09-02 5 views
9

У меня есть два вектора:IfElse() с тремя условиями

a<-rep(1:2,100) 

b<-sample(a) 

Я хотел бы иметь IfElse условие, которое сравнивает каждое значение a с соответствующим значением b, и выполняет следующие действия:

if a>b 1 
if a<b 0 
if a=b sample(1:2,length(a),replace=T) 

первые два можно сделать с помощью:

ifelse(a>b,1,0) 

, но я п не обязательно, как включить случай, когда a и b равны.

+0

рассмотрите также использование 'switch', предназначенного только для этой ситуации (где у вас есть/else/else/else ...). Сочетание этого с «apply» может привести вас к тому, где вы хотите быть, элегантно. –

ответ

16

Как о добавлении другого IfElse:

ifelse(a>b, 1, ifelse(a==b, sample(1:2, length(a), replace = TRUE), 0)) 

В этом случае вы получите значение 1, если а> Ь, то, если равно б это либо 1 или 2 (sample(1:2, length(a), replace = TRUE)), и если нет (поэтому a должно быть меньше b) вы получаете значение 0.

+2

Это будет репликация 'sample (1: 2,1)' для каждого 'a == b'. – mpiktas

+0

Вы правы, спасибо за добавление! – Rob

+1

'sample (1: 2,1)' можно заменить на 'sample (1: 2, length (a), replace = TRUE)' или 'sample (a)' теперь OP уточнил, что он хочет. – flodel

8

В вашем вопросе есть двусмысленность. Вам нужны разные случайные значения для всех индексов, где a==b или одно случайное значение для всех индексов?

Ответ от @Rob будет работать во втором сценарии. Для первого сценария я предлагаю избежать ifelse:

u<-rep(NA,length(a)) 
u[a>b] <- 1 
u[a<b] <- 0 
u[a==b] <- sample(1:2,sum(a==b),replace=TRUE) 
+0

да, вы правы, мне нужны разные случайные значения для каждого индекса. – ghb

9

Это легкий путь:

(a > b) + (a == b) * sample(2, length(a), replace = TRUE) 

Это основано на расчетах с булевыми значениями, которые отлиты в числовые значения.

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