2016-08-22 4 views
0

У меня есть следующий фрагмент кодаПонимание поведения логических индексов

x <- 20:1 
x 
x[c(T, F, NA)] <- 1 
x 
[1] 1 19 18 1 16 15 1 13 12 1 10 9 1 7 6 1 4 3 1 1 

Я не понимаю, как сгенерирован результат. Я думал, что T = 1, F = 0, а NA рассматривается как ложное (так NA = 0).

Так я ожидал следующий результат:

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

Может кто-нибудь объяснить мне, что R делает? Есть ли какие-то скрытые «If ... then» -Statement? 20, 17, 14, 11, 8..., по-видимому, True, но почему?

+6

Изучите 'help (" [")'. Там все объяснено. И вы не должны использовать R, не поняв большую часть контента на этой странице справки. – Roland

+1

Обратите внимание на элементы, отличные от 'NA' в этом выражении: 'x [rep_len (c (T, F, NA), length (x))]'. – nrussell

ответ

1

Вы можете сначала проверить,

x[T] 
#[1] 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 

, а затем

x[F] 
#integer(0) 

Также проверьте,

x[NA] 
# [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 

R использует циклическую индексирование (не уверен, если это правильное слово)

Теперь, когда вы делаете

x[c(T, F, NA)] 

это дает,

#[1] 20 NA 17 NA 14 NA 11 NA 8 NA 5 NA 2 

печатает все T значения, игнорирует все F значения и дает NA вместо всех NA значений.

Теперь, когда вы назначаете

x[c(T, F, NA)] <- 1 

только индексы которых имеет индекс, как T заменяется 1, остальное все как есть, давая

#[1] 1 19 18 1 16 15 1 13 12 1 10 9 1 7 6 1 4 3 1 1 

Как прокомментировал @alexis_laz, для NA s, цитируемые в документе

При извлечении, числовой, логический или chara cter NA index выбирает неизвестный элемент и поэтому возвращает NA в соответствующем элементе логического, целочисленного, числового, сложного или символьного результата и NULL для списка.

При замене (с использованием индексации на lhs присвоения) NA не выбирает элемент, подлежащий замене. Поскольку существует неоднозначность относительно того, следует ли использовать элемент в правой или нет, это разрешено только если значение шк имеет длину один

Чтобы подвести итог, в то время извлечения x[NA] он возвращает в качестве NA и при замене x[NA] <- он не выбирает ни один элемент, который нужно заменить.

+1

Я думаю, было бы более удобно проверять поведение '' [<- "', а не '' ['', когда '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Как '?" ["', 'X [NA'] возвращает' NA', в то время как 'x [NA] = значение' игнорируется. –

+0

Прежде всего, спасибо за ваши ответы! ? "[" и? "[<-" дает мне ту же страницу справки (Извлеките или замените части объекта) – ruedi