vector1 = c(2, 2, 2, 2, 2, 2)
vector2 = c(2, 2, 3, 3, 3, 3)
vector3 = c(2, 2, 1, 2, 2, 2)
我想知道向量中的数字是升序/保持不变还是降序。因此,对于vector1
和vector2
,它应该是TRUE
,而对于vector3
,它应该是FALSE
。简单地说,如果向量中存在反转,则应返回FALSE
。如果没有编写循环,有没有快速的方法呢?
答案 0 :(得分:24)
有一个名为R
的基本is.unsorted
函数适用于这种情况:
!is.unsorted(vector1)
# [1] TRUE
!is.unsorted(vector2)
# [1] TRUE
!is.unsorted(vector3)
# [1] FALSE
这个函数非常快,因为它几乎直接吸引到编译的C
代码。
我最初的想法是使用sort
和identical
, a la identical(sort(vector1), vector1)
,但这很慢;那说,我认为这种方法可以扩展到更灵活的情况。
如果速度非常重要,我们可以跳过is.unsorted
的一些开销并直接调用内部函数:
.Internal(is.unsorted(vector1, FALSE))
(FALSE
将FALSE
传递给参数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