Значения NA и совокупная функция R
Вот простой кадр данных с отсутствующим значением:
M = data.frame( Name = c('name','name'), Col1 = c(NA,1) , Col2 = c(1,1))
Когда я применяю агрегат к M следующим образом:
aggregate(.~Name, M, FUN=sum, na.rm=TRUE)
результат:
RowName Col1 Col2
name 1 1
Таким образом, вся первая строка игнорируется. Но если я делаю
aggregate(M[,2:3], by=list(M$Name), FUN=sum, na.rm=TRUE)
результат
Group.1 Col1 Col2
name 1 2
Таким образом, игнорируется только запись (1,1).
Это вызвало серьезную головную боль отладки в одном из моих кодов, так как я думал, что эти два вызова эквивалентны. Есть ли веская причина, почему метод ввода "формула" обрабатывается по-разному?
Спасибо.
Ответы
Ответ 1
Хороший вопрос, но, на мой взгляд, это не должно было вызвать серьезную головную боль отладки, потому что он достаточно четко документирован в нескольких местах на странице руководства для aggregate
.
Сначала в разделе использования:
## S3 method for class 'formula'
aggregate(formula, data, FUN, ...,
subset, na.action = na.omit)
Позже, в описании:
na.action
: функция, которая указывает, что должно произойти, когда данные содержат значения NA. По умолчанию следует игнорировать отсутствующие значения в данных переменных.
Я не могу ответить, почему режим формулы был написан по-разному - что-то, на что авторам авторам пришлось бы отвечать --- но используя приведенную выше информацию, вы, вероятно, можете использовать следующее:
aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action=NULL)
# Name Col1 Col2
# 1 name 1 2
Ответ 2
Если вы хотите, чтобы версия формулы была эквивалентной, попробуйте следующее:
M = data.frame( Name = rep('name',5), Col1 = c(NA,rep(1,4)) , Col2 = rep(1,5))
aggregate(. ~ Name, M, function(x) sum(x, na.rm=TRUE), na.action = na.pass)