如何通过递减和/或na.last参数来对R

时间:2015-07-27 23:07:22

标签: r sorting vector tapply

我正在自学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 ,而我仍然遇到同样的问题。

我正在使用R 3.2.0在Mac OS X 10.10.4上运行此代码。使用 sort 独立会产生所需的行为(自己调用 sort 而不通过 tapply ,即),因为它在更改时会正常运行减少 na.last 参数。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

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

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

上面的代码行基本上是按照分类向量y&#34;对&#34;排序向量x进行分组。您的向量x根本不是一个分类向量,它是一个只有不同值的数字向量,加上一个NA。 tapply()忽略NA索引,然后将x中剩余的三个不同数值中的每一个视为单独的组,因此它将三个相应字符串中的每一个从y传递到三个不同的调用sort(),这显然对任何事情都没有影响(这解释了为什么你的自定义参数没有效果)并返回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"