2013-11-13 6 views
0

У меня есть проблема с использованием для цикла в R. Следующего кодадля цикла замены терпит неудачу -1

a <- seq(-2, 5) 
for(i in 1:length(a)){ 
    a[i] <- if(a[i] <= 0) "aa" else a[i] 
} 

должен привести к следующему вектору

> a 
[1] "aa" "aa" "aa" "1" "2" "3" "4" "5" 

Вместо этого мы имеем следующий результат:

> a 
[1] "aa" "-1" "aa" "1" "2" "3" "4" "5" 

Почему R не может заменить «-1» на «aa»?

Мы пытались еще одно решение, которое работает отлично:

a <- seq(-2, 5) 
b <- NULL 
for(i in 1:length(a)){ 
    b[i] <- if(a[i] <= 0) "aa" else a[i] 
} 

она производит ожидаемый результат:

> b 
[1] "aa" "aa" "aa" "1" "2" "3" "4" "5" 

Почему последний пример отлично работает и первый не?

Большое вам спасибо за помощь!

С уважением!

+6

Невозможно воспроизвести. Вы где-то ошибаетесь. –

+1

Замечание: хотя ваша петля, кажется, работает нормально, вы можете взглянуть на 'ifelse'. Например. 'ifelse (a <= 0," aa ", a)' – Henrik

+1

@MatthewPlourde: большинство не всегда правильно. –

ответ

4

Последовательность сортировки может быть не такой, как вы (или Мэтью) понимаете. Символ «-» не может быть ниже в лексическом порядке для вашей операционной системы. Сравнение строк зависит от ОС. (См. ?Comparison). После первой замены весь вектор был принужден к символу, и если "-" > 0 возвращает TRUE на вашем компьютере, тогда у вас есть ответ. Я буду держать пари, что этот код будет действовать, как вы ожидали:

a <- seq(-2, 5) 
for(i in 1:length(a)){ 
    a[i] <- if(as.numeric(a[i]) <= 0) "aa" else a[i] 
} 

Я подозреваю, что предложение Хенрика также должно относиться к вашим ожиданиям, потому что это создаст логический вектор из числового сравнения, а затем выбрать из выбора «aa» и a.

(Во втором случае не было принуждения вектора к символу.)

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