我正在自学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 参数。
提前感谢您的帮助。
答案 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"