2017-02-08 4 views
11

я только обнаружил следующее поведение функции is.na(), которую я не понимаю:Почему is.na() меняет свой аргумент?

df <- data.frame(a = 5:1, b = "text") 
df 
## a b 
## 1 5 text 
## 2 4 text 
## 3 3 text 
## 4 2 text 
## 5 1 text 
is.na(df) 
##   a  b 
## [1,] FALSE FALSE 
## [2,] FALSE FALSE 
## [3,] FALSE FALSE 
## [4,] FALSE FALSE 
## [5,] FALSE FALSE 
is.na(df) <- "0" 
df 
## a b 0 
## 1 5 text NA 
## 2 4 text NA 
## 3 3 text NA 
## 4 2 text NA 
## 5 1 text NA 

Мой вопрос
Почему is.na() изменить свой аргумент (и в этом случае добавляет дополнительный столбец данных Рамка)? В этом случае его поведение кажется дополнительным загадочным (или, по крайней мере, неожиданным), потому что результат запроса - FALSE для всех экземпляров.

NB
Этот вопрос не о подмножествах и изменениях NA значения в кадре данных, - я знаю, как сделать это (df[is.na(df)] <- "0"). Этот вопрос касается поведения функции is.na! Почему назначение функции is.something меняет сам аргумент - это неожиданно.

+0

Вы должны использовать эти логические переменные в качестве ссылки на индекс, то есть 'df [is.na (df)] <- 0' – Sotos

+0

@ Сото: Посмотрите мои комментарии. – vonjd

+0

@vonjd Я видел ваш комментарий, но я хочу сказать, что ваше назначение не работает, даже если есть значения NA, то есть 'df $ a [3] <- NA; is.na (df) <- "0" ' – akrun

ответ

14

Фактическая функция здесь используется не is.na(), а функция назначения `is.na<-`, для которой по умолчанию используется метод `is.na<-.default`. Печать этой функции на консоли мы видим:

function (x, value) 
{ 
    x[value] <- NA 
    x 
} 

Итак, ясно, value должен быть индекс здесь. Если вы указали data.frame, как df["0"], он попытается выбрать столбец с именем "0". Если вы присвойте что-то df["0"], столбец будет создан и заполнен (в данном случае) NA.

Чтобы уточнить, `is.na<-` наборы значений NA, он делает не заменить NA значения с чем-то другим.

+0

Спасибо, поэтому я пропустил то, что в этом случае присваивание 'is.na' фактически * устанавливает * значения в' NA'. Я бы никогда не подумал об этом. – vonjd

+2

Это задокументировано, но, возможно, немного удивительно, да. – Axeman

+0

Это точно так же, как rownames() и colnames() работает, как и другие примеры. Они выполняют и устанавливают. Это на самом деле очень последовательный синтаксис. – Elin

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