首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >median()的奇怪行为?

median()的奇怪行为?
EN

Stack Overflow用户
提问于 2011-05-06 02:02:10
回答 3查看 3.2K关注 0票数 11

在将median()函数应用于数据帧时,我注意到一些不一致的行为。“不一致的行为”通常意味着我不理解某事,所以我希望有人愿意为我澄清这一点。

我意识到一些函数(例如,min()max())将数据帧转换为向量,并返回整个df的相应值,而mean()sd()则为每列返回一个值。虽然有点令人困惑,但这些行为上的差异不会造成太多问题,因为如果返回标量而不是向量,大多数代码都会崩溃。然而,median()似乎并不一致。例如:

代码语言:javascript
复制
dat <- data.frame(x=1:100, y=2:101)
median(dat)

返回一个向量:[1] 50.5 51.5

但是,有时它会崩溃:

代码语言:javascript
复制
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)都会产生正确的结果。

还要考虑以下几点:

代码语言:javascript
复制
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()函数是如何工作的。

此外,像sdmean()min()max()这样的函数在上述所有情况下都会产生预期的结果(如果看起来不一致)。

我知道我可以使用像sapply(dat2, median)这样的东西来获得必要的结果,但我想知道为什么R神选择以一种至少在表面上看起来不一致的方式来实现这些核心统计函数。我怀疑我,可能还有其他新手,可能不理解一些基本的概念,我很感激你的洞察力。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-06 02:05:27

这个确切的现象最近在R-devel上的median and data frames线程中进行了讨论。人们的共识似乎是mean.data.frame方法应该被弃用,用户应该依赖sapply

票数 12
EN

Stack Overflow用户

发布于 2011-05-06 02:08:46

mean不同,median没有针对data.frame类对象的方法。使用plyr包和colwise函数可以达到预期的效果。或者使用*apply函数族。

代码语言:javascript
复制
> 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 
票数 6
EN

Stack Overflow用户

发布于 2011-05-06 03:17:26

最简单的方法是使用miscTools

代码语言:javascript
复制
> library(miscTools)
> dat3 <- data.frame(x=-50:50, y=(-50:50)^2)
> colMedians(dat3)
  x   y 
  0 625 

这是正确的,不像

代码语言:javascript
复制
> median(dat3)
[1]   0 850

matrixStats包也有一个colMedians函数,但不是用于数据帧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5902183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档