R:如何检查向量是上升还是下降

时间:2015-08-02 17:51:42

标签: r

vector1 = c(2, 2, 2, 2, 2, 2)
vector2 = c(2, 2, 3, 3, 3, 3)
vector3 = c(2, 2, 1, 2, 2, 2)

我想知道向量中的数字是升序/保持不变还是降序。因此,对于vector1vector2,它应该是TRUE,而对于vector3,它应该是FALSE。简单地说,如果向量中存在反转,则应返回FALSE。如果没有编写循环,有没有快速的方法呢?

2 个答案:

答案 0 :(得分:24)

有一个名为R的基本is.unsorted函数适用于这种情况:

!is.unsorted(vector1)
# [1] TRUE
!is.unsorted(vector2)
# [1] TRUE
!is.unsorted(vector3)
# [1] FALSE

这个函数非常快,因为它几乎直接吸引到编译的C代码。

我最初的想法是使用sortidentical a la identical(sort(vector1), vector1),但这很慢;那说,我认为这种方法可以扩展到更灵活的情况。

如果速度非常重要,我们可以跳过is.unsorted的一些开销并直接调用内部函数:

.Internal(is.unsorted(vector1, FALSE))

FALSEFALSE传递给参数strictly)。这为小矢量提供了~4倍的加速。

为了了解最终选项的速度,这是一个基准:

library(microbenchmark)
set.seed(10101)
srtd <- sort(sample(1e6, rep = TRUE)) # a sorted test case
unsr <- sample(1e6, rep = TRUE) #an unsorted test case

microbenchmark(times = 1000L,
               josilber = {all(diff(srtd) >= 0)
                         all(diff(unsr) >= 0)},
               mikec = {identical(sort(srtd), srtd)
                      identical(sort(unsr), unsr)},
               baser = {!is.unsorted(srtd)
                      !is.unsorted(unsr)},
               intern = {!.Internal(is.unsorted(srtd, FALSE)) 
                       !.Internal(is.unsorted(unsr, FALSE))})

我的机器上的结果:

# Unit: microseconds
#      expr       min         lq       mean     median        uq        max neval  cld
#  josilber 30349.108 30737.6440 34550.6599 34113.5970 34964.171 155283.320  1000   c 
#     mikec 93167.836 94183.8865 97119.4493 94852.7530 97528.859 229692.328  1000    d
#     baser  1089.670  1168.7400  1322.9341  1296.7375  1347.946   6301.866  1000  b  
#    intern   514.816   532.4405   576.2867   560.5955   566.236   2456.237  1000 a   

所以直接调用内部函数(需要注意的是:你需要确保你的向量非常干净 - 没有NA s等),相对于基本R函数,你的速度提高了~2倍,这比使用diff快〜30倍,这反过来是我最初选择的2倍。

答案 1 :(得分:19)

您可String text = "\"OR\\n\\nThe Central Site Engineering\\u2019s \\u201cfrontend\\u201d, where developers turn to\""; text = text.replaceAll("(\\\\n)+"," ") .replaceAll("\\\\u[0-9A-Ha-h]{4}", ""); 计算元素与diff之间的差异,以检查它们是否都是非负数:

all

上面的代码检查所有向量是否都不减少,您可以将all(diff(vector1) >= 0) # [1] TRUE all(diff(vector2) >= 0) # [1] TRUE all(diff(vector3) >= 0) # [1] FALSE 替换为>= 0以检查它们是否不增加。相反,如果您的目标是确定非递减或不递增的向量(也就是说它们在同一向量中没有增加和减少的步骤),那么进行简单的修改:

<= 0