在将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神选择以一种至少在表面上看起来不一致的方式来实现这些核心统计函数。我怀疑我,可能还有其他新手,可能不理解一些基本的概念,我很感激你的洞察力。
发布于 2011-05-06 02:05:27
这个确切的现象最近在R-devel上的median and data frames线程中进行了讨论。人们的共识似乎是mean.data.frame方法应该被弃用,用户应该依赖sapply。
发布于 2011-05-06 02:08:46
与mean不同,median没有针对data.frame类对象的方法。使用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 发布于 2011-05-06 03:17:26
最简单的方法是使用miscTools包
> library(miscTools)
> dat3 <- data.frame(x=-50:50, y=(-50:50)^2)
> colMedians(dat3)
x y
0 625 这是正确的,不像
> median(dat3)
[1] 0 850matrixStats包也有一个colMedians函数,但不是用于数据帧。
https://stackoverflow.com/questions/5902183
复制相似问题