Подтвердить что ты не робот

Значения 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).

Это вызвало серьезную головную боль отладки в одном из моих кодов, так как я думал, что эти два вызова эквивалентны. Есть ли веская причина, почему метод ввода "формула" обрабатывается по-разному?

Спасибо.

4b9b3361

Ответ 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)