/ / Wartości NA i funkcja agregująca R - r, agregat

Wartości NA i funkcja agregacji R - r, agregat

Oto prosta ramka danych z brakującą wartością:

M = data.frame( Name = c("name","name"), Col1 = c(NA,1) , Col2 = c(1,1))

Kiedy stosuję agregację do M w ten sposób:

aggregate(.~Name, M, FUN=sum, na.rm=TRUE)

wynik to:

RowName Col1 Col2
name    1    1

Tak więc cały pierwszy rząd jest ignorowany. Ale jeśli to zrobię

aggregate(M[,2:3], by=list(M$Name), FUN=sum, na.rm=TRUE)

wynik to

Group.1 Col1 Col2
name    1    2

Więc tylko wpis (1,1) jest ignorowany.

Spowodowało to poważny problem z debugowaniem w jednym z moich kodów, ponieważ myślałem, że te dwa połączenia są równoważne. Czy istnieje dobry powód, dla którego metoda „formuły” jest traktowana inaczej?

Dzięki.

Odpowiedzi:

44 dla odpowiedzi nr 1

Dobre pytanie, ale moim zdaniem nie powinno to spowodować poważny debugowanie bólu głowy, ponieważ jest to dość wyraźnie udokumentowane w wielu miejscach na stronie podręcznika aggregate.

Po pierwsze, w sekcji użycia:

## S3 method for class "formula"
aggregate(formula, data, FUN, ...,
subset, na.action = na.omit)

Później w opisie:

na.action: funkcja wskazująca, co powinno się stać, gdy dane zawierają wartości NA. Domyślnie ignorowane są brakujące wartości w danych zmiennych.


Nie mogę odpowiedzieć czemu tryb formuły został napisany inaczej - to jest coś, na co autorzy funkcji musieliby odpowiedzieć --- ale korzystając z powyższych informacji, prawdopodobnie możesz użyć następujących:

aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action=NULL)
#   Name Col1 Col2
# 1 name    1    2

16 dla odpowiedzi nr 2

Jeśli chcesz, aby wersja formuły była równoważna, spróbuj tego:

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)