Странное поведение с медианой ()? - PullRequest
10 голосов
/ 05 мая 2011

Я заметил некоторые противоречивые действия при применении функции median() к кадрам данных.«Непоследовательное поведение» обычно означает, что я чего-то не понимаю, поэтому я надеюсь, что кто-то захочет прояснить это для меня.

Я понимаю, что некоторые функции (например, min(), max()) преобразуют кадр данных в вектор и возвращают соответствующее значение для всего df, тогда как mean() и sd() возвращают значение для каждогоколонка.Хотя это немного сбивает с толку, эти различия в поведении не вызывают много проблем, так как большая часть кода сломается, если вместо вектора возвращается скаляр.Однако median() кажется несовместимым.Например:

dat <- data.frame(x=1:100, y=2:101)
median(dat)

Возвращает вектор: [1] 50.5 51.5

Но иногда он ломается:

dat2 <- data.frame(x=1:100, y=rnorm(100))
median(dat2)

Возвращает: [1] NA NA Warning messages: 1: In mean.default(X[[1L]], ...) : argument is not numeric or logical: returning NA 2: In mean.default(X[[2L]], ...) : argument is not numeric or logical: returning NA

Однако median(dat2$x) и median(dat2$y) оба дают правильный результат.

Также учтите следующее:

dat3 <- data.frame(x=1:100, y=1:100)
dat4 <- data.frame(x=1:100, y=100:199)

В приведенном выше примере median(dat3) возвращает [1] 50.5 NA, а median(dat4) возвращает [1] 50.5 149.5!Я ожидаю, что оба или ни один из них не сработает.Итак, я явно не понимаю, как работает функция median().

Кроме того, такие функции, как sd, mean(), min() и max(), все дают ожидаемые результаты (если кажутся несовместимыми).) результаты во всех вышеупомянутых случаях.

Я знаю, что могу использовать что-то вроде sapply(dat2, median), чтобы получить необходимый результат, но мне интересно, почему боги R решили реализовать эти основные функции статистики таким образом, чтобыПо крайней мере, на первый взгляд кажется противоречивым.Я подозреваю, что я и, возможно, другие неофиты, вероятно, не понимаем какой-то фундаментальной концепции, и я был бы признателен за ваше понимание.

Ответы [ 3 ]

12 голосов
/ 05 мая 2011

Это точное явление недавно обсуждалось в потоке медиана и фреймы данных на R-devel.Похоже, консенсус заключался в том, что метод mean.data.frame не рекомендуется использовать, а пользователи должны полагаться на sapply.

5 голосов
/ 05 мая 2011

median не имеет метода для объектов класса data.frame, в отличие от mean.Используйте пакет plyr и функцию colwise для достижения желаемого результата.Или используйте семейство функций *apply.

> sapply(mtcars, median)                                                                                                     
    mpg     cyl    disp      hp    drat      wt    qsec      vs      am    gear                                              
 19.200   6.000 196.300 123.000   3.695   3.325  17.710   0.000   0.000   4.000                                              
   carb                                                                                                                      
  2.000                                                                                                                      
> colwise(median)(mtcars)                                                                                                    
   mpg cyl  disp  hp  drat    wt  qsec vs am gear carb                                                                       
1 19.2   6 196.3 123 3.695 3.325 17.71  0  0    4    2 
1 голос
/ 05 мая 2011

Самый простой способ с пакетом miscTools

> library(miscTools)
> dat3 <- data.frame(x=-50:50, y=(-50:50)^2)
> colMedians(dat3)
  x   y 
  0 625 

что правильно, в отличие от

> median(dat3)
[1]   0 850

Пакет matrixStats также имеет функцию colMedians, но не для данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...