如何通过递减 and/or na.last 参数对 R 中的 tapply 进行排序

How to pass decreasing and/or na.last argument to sort through tapply in R

我正在自学 R 的基础知识,在尝试传递 sort 函数时使用函数 tapply 遇到了麻烦使用非默认可选参数进行排序。这是我面临的麻烦的一个例子:

给定向量

x <- c(1.1, 1.0, 2.1, NA_real_)
y <- c("a", "b", "c","d")

我发现

tapply(y, x, sort, decreasing=TRUE, na.last=TRUE)

产生相同的输出,而不管我赋予递减和 na.last 的逻辑赋值如何。事实上,输出始终默认为排序默认值

decreasing = FALSE, na.last = NA

记录一下,当输入上面的例子时,输出是

> tapply(y, x, sort, decreasing=TRUE, na.last=TRUE)
  1 1.1 2.1
"b" "a" "c"

我还要提一下,如果我定义替代函数

sort2 <- function(v) sort(v, decreasing=TRUE, na.last=TRUE);

并把sort2传给tapply,还是遇到同样的麻烦

我在 Mac OS X 10.10.4 上使用 运行 此代码,使用 R 3.2.0。单独使用 sort 会产生所需的行为(在不通过 tapply 的情况下自行调用 sort,即是),因为它在改变 decreasingna.last 参数时会适当地起作用。

提前感谢您的帮助。

我认为您没有正确使用 tapply()

tapply(y, x, sort, decreasing=TRUE, na.last=TRUE)

上面这行代码基本上就是"sort vector y grouping by categorical vector x"。你的向量 x 根本不是一个真正的分类向量,它是一个只有不同值的数字向量,加上一个 NA。 tapply() 忽略 NA 索引,然后将 x 中剩余的三个不同数值中的每一个都视为单独的组,因此它会将 y 中的三个对应字符串中的每一个传递给三个不同的sort() 的调用,这显然对任何事情都没有影响(这解释了为什么您的自定义参数没有效果)和 returns x 组排序的结果。

这是一个如何做我认为你想做的事情的例子:

x <- c(NA,1,2,3,NA,2,1,3);
g <- rep(letters[1:2],each=4);
x;
## [1] NA  1  2  3 NA  2  1  3
g;
## [1] "a" "a" "a" "a" "b" "b" "b" "b"
tapply(x,g,sort,decreasing=T,na.last=T);
## $a
## [1]  3  2  1 NA
##
## $b
## [1]  3  2  1 NA
##

编辑: 当你想用另一个向量对一个向量进行排序时,你可以使用order():

y[order(x,decreasing=T,na.last=T)];
## [1] "c" "a" "b" "d"
y[order(x,decreasing=F,na.last=T)];
## [1] "b" "a" "c" "d"