【问题标题】:Determine if a vector is ordered确定向量是否有序
【发布时间】:2014-05-08 16:51:24
【问题描述】:

我想确定一个向量在 R 中是始终增加还是始终减少。

理想情况下,如果我有这三个向量:

asc=c(1,2,3,4,5)
des=c(5,4,3,2,1)
non=c(1,3,5,4,2)

我希望前两个返回 TRUE,最后一个返回 FALSE。

我尝试了几种方法。首先,我试过了:

> is.ordered(asc)
[1] FALSE
> is.ordered(des)
[1] FALSE
> is.ordered(non)
[1] FALSE

我也试过了:

> order(non)
[1] 1 5 2 4 3

并希望我可以简单地将这个向量与1,2,3,4,55,4,3,2,1 进行比较,但即使这样也会返回一个逻辑字符串,而不是一个单一的真或假:

> order(non)==c(1,2,3,4,5)
[1]  TRUE FALSE FALSE  TRUE FALSE

【问题讨论】:

  • 在 Matlab 中,我会检查向量的 diff 是否始终大于零或始终小于零:all(diff(myVec)>=0) || all(diff(myVec)<=0);。我确信r中存在类似的东西。

标签: r sorting


【解决方案1】:

也许is.unsorted 是您正在寻找的功能

> is.unsorted(asc)
[1] FALSE
> is.unsorted(rev(des)) # here you need 'rev'
[1] FALSE
> is.unsorted(non)
[1] TRUE

is.unsorted的描述中可以找到:

测试一个对象是否未排序(按升序),无需对其进行排序。

【讨论】:

    【解决方案2】:

    这是使用?is.unsorted的一种方式:

    is.sorted <- function(x, ...) {
        !is.unsorted(x, ...) | !is.unsorted(rev(x), ...)
    }
    

    查看is.unsorted 的附加参数,也可以在此处传递。

    【讨论】:

      【解决方案3】:

      这是一种不使用 is.unsorted() 来检查向量是否已排序的方法。如果给定向量中的所有元素都以升序方式排序,则此函数将返回 true,否则返回 false:

      is.sorted <- function(x) {
        if(all(sort(x, decreasing = FALSE) == x)) {
          return(TRUE)
        } else {
          return(FALSE)
        }
      }
      

      【讨论】:

      • 我要在这里学究气了。你不去if else 条件。当您编写all(sort(x, decreasing = FALSE) == x) 时,这已经是一个逻辑值。因此,当它是 TRUE 时返回 TRUE,而当它不是时返回 FALSE 就像重言式一样。认为你应该知道。
      猜你喜欢
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多