2015-11-18 41 views
5

używać następujące data.frame jako przykład:kruszywa na.action = na.pass zapewnia niespodziewaną odpowiedź

d <- data.frame(x=c(1,NA), y=c(2,3)) 

chciałbym sumowania wartości Y od zmiennej x. Ponieważ nie ma wspólnej wartości x, spodziewałbym się, że agregacja po prostu da mi oryginalną kopię danych.frame, gdzie NA jest traktowana jako grupa. Ale agregacja daje mi następujące wyniki.

>aggregate(y ~ x, data=d, FUN=sum) 
    x y 
1 1 2 

Czytałem dokumentację dotyczącą zmiany domyślnych działań na.action, ale nie wydaje mi się, aby dało mi coś znaczącego.

>aggregate(y ~ x, data=d, FUN=sum, na.action=na.pass) 
    x y 
1 1 2 

Co się dzieje? Wydaje mi się, że nie rozumiem, co robi na tym przypadku na.pass. Czy istnieje opcja, aby osiągnąć to, co chcę w R? Każda pomoc będzie bardzo ceniona.

+2

Mówisz, że rozważasz wartość 'NA' jako zmienną grupującą? Czy chcesz "NA", czy nie? (Nie jest to jasne, ponieważ używasz 'na.rm = TRUE' jako części twojego testowania ... – A5C1D2H2I1M1N2O1R2T1

+0

Tak, chcę NA jako grupę – Sanias

+0

Dokumentacja mówi" Wiersze z brakującymi wartościami w dowolnym z nich zmienne zostaną pominięte w wyniku. "Jeśli nie chcesz tego, musisz przekodować zmienną' by' lub użyć innej funkcji agregacji .. – Roland

Odpowiedz

7

aggregate korzysta z tapply, która z kolei korzysta z factor na swojej zmiennej grupującej.

Ale spójrz na to, co dzieje się z NA wartości w factor:

factor(c(1, 2, NA)) 
# [1] 1 2 <NA> 
# Levels: 1 2 

Zanotuj levels. Można skorzystać z addNA zachować NA:

addNA(factor(c(1, 2, NA))) 
# [1] 1 2 <NA> 
# Levels: 1 2 <NA> 

Tak więc, prawdopodobnie trzeba zrobić coś takiego:

aggregate(y ~ addNA(x), d, sum) 
# addNA(x) y 
# 1  1 2 
# 2  <NA> 3 

albo coś podobnego:

d$x <- addNA(factor(d$x)) 
str(d) 
# 'data.frame': 2 obs. of 2 variables: 
# $ x: Factor w/ 2 levels "1",NA: 1 2 
# $ y: num 2 3 
aggregate(y ~ x, d, sum) 
#  x y 
# 1 1 2 
# 2 <NA> 3 

(Alternatywnie, zmodyfikuj wersję na coś podobnego do "data.table", która nie będzie tylko szybsza n aggregate, ale da także bardziej spójne zachowanie z wartościami NA. Nie musisz zwracać uwagi na to, czy jesteś using the formula method of aggregate or not.)

library(data.table) 
as.data.table(d)[, sum(y), by = x] 
#  x V1 
# 1: 1 2 
# 2: NA 3 
+0

Dziękuję, doceniam to, Ciekawi mnie funkcjonalność na. Dokumentacja mówi, że "zwraca obiekt niezmieniony". Dlaczego więc NA na pozór zostały usunięte? – Sanias

+0

@Sanias, czyli w odniesieniu do kolumn, które są agregowane, a nie kolumn "według". – A5C1D2H2I1M1N2O1R2T1