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 1Dobre 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)