【问题标题】:How to pass decreasing and/or na.last argument to sort through tapply in R如何通过递减和/或 na.last 参数对 R 中的 tapply 进行排序
【发布时间】:2015-10-18 07:55:18
【问题描述】:

我正在自学 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)

无论我赋予 reduction 和 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 会产生所需的行为(即在不通过 tapply 的情况下自行调用 sort),因为它在更改时会正确执行递减na.last参数。

提前感谢您的帮助。

【问题讨论】:

  • 您期望什么输出?您将 y 拆分为 x 并对每个组件进行排序,其中包含单个值。试试x &lt;- c(1.1, 1.0, 2.1, NA_real_); y &lt;- c("a", "a", "d","d"); tapply(x, y, sort, decreasing=TRUE, na.last=TRUE)
  • @nongkrong 我所希望的是,通过传递不同的递减值,我可以在排序 1、1.1、2.1(当递减=F 时)和 2.1、1.1、1(当减少=T) 并正确调整了相应的字母分配。

标签: r sorting vector tapply


【解决方案1】:

我认为您没有正确使用 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() 的三个不同调用,这显然对任何事情都没有影响(这解释了为什么您的自定义参数无效)并返回由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"

【讨论】:

  • 关于你的例子,我希望通过调整decreasingy 中的字母可以按b a c(与decreasing=F 一样)或@987654338 排序@(如果 decreasing=T 像我希望的那样工作)。但是,我确实想尝试使用tapply 来使用数字向量x 的排序来对字符向量y 进行排序。无论如何,再次感谢。您的解释消除了我对tapply 实施的大部分误解。
  • 感谢您的编辑!实际上,我已经预先运行了您在编辑中描述的排序实现。 tapply 的使用纯粹是为了教学(希望找到替代方法来产生相同的结果),因为我正在努力搞定具体细节。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 2014-12-18
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多