2015-07-14 1 views
2

Используя R, я собираюсь рассчитать групповые средства с помощью aggregate(..., mean). Однако средний доход неправильный.aggregate + mean возвращает неправильный результат

testdata <-read.table(text=" 
a b c d year 
2 10 1 NA 1998 
1 7 NA NA 1998 
4 6 NA NA 1998 
2 2 NA NA 1998 
4 3 2 1 1998 
2 6 NA NA 1998 
3 NA NA NA 1998 
2 7 NA 3 1998 
1 8 NA 4 1998 
2 7 2 5 1998 
1 NA NA 4 1998 
2 5 NA 6 1998 
2 4 NA NA 1998 
3 11 2 7 1998 
1 18 4 10 1998 
3 12 7 5 1998 
2 17 NA NA 1998 
2 11 4 5 1998 
1 3 1 1 1998 
3 5 1 3 1998 
",header=TRUE,sep="") 
aggregate(. ~ year, testdata, 
      function(x) c(mean = round(mean(x, na.rm=TRUE), 2))) 
colMeans(subset(testdata, year=="1998", select=d), na.rm=TRUE) 

aggregate говорит среднее d для группы 1998 4,62, но это 4,5.

Сокращение данных только один столбец, aggregate получает это право:

aggregate(. ~ year, test[4:5], 
      function(x) c(mean = round(mean(x, na.rm=TRUE), 2))) 

Что случилось с моей функции aggregate() + mean()?

ответ

5

Агрегат вынимает ваши строки, содержащие NA в любой колонке, перед передачей его в среднюю функцию. Попробуйте выполнить общий вызов без na.rm=TRUE - он все равно будет работать.

Чтобы это исправить, необходимо изменить na.action по умолчанию в совокупности с na.pass:

aggregate(. ~ year, testdata, 
      function(x) c(mean = round(mean(x, na.rm=TRUE), 2)), na.action = na.pass) 


    year a b c d 
1 1998 2.15 7.89 2.67 4.5 
+0

Ницца. Или вообще пропустите интерфейс формулы, что и вводит 'na.omit' по умолчанию -' aggregate (testdata [c ("a", "b", "c", "d")], testdata ["year" ], mean, na.rm = TRUE) ' – thelatemail

+0

Этот подход также позволяет вычислять среднее значение, max, min и т. д. для подмножества данных внутри группы (например, таймфрейма), которое имеет числовые значения, игнорируя данные в это группа, которая является NA. Большой! – DirtStats