如何通过递减 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,即是),因为它在改变 decreasing 和 na.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"
我正在自学 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,即是),因为它在改变 decreasing 和 na.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"