检查向量中的数字是否在R

时间:2017-06-10 12:06:14

标签: r

我需要检查矢量的第一个数字是否小于第二个数字,第二个数字是否大于第三个数字,依此类推。到目前为止,我可以计算出这样的矢量数的差异:

n <- sample(3) #may n = 132
diff(n) # outputs 2 -1

我需要检查第一个数字是正数,第二个数字是否定等。我遇到的问题是我需要程序为长度为n的向量执行此操作。我该如何实现呢?

由于我不太清楚我在这里想做什么,我会给出一个更好的例子:

可能是矢量c(1,2,4,3)。

我需要检查矢量的第一个数字是否小于第二个,第二个数字大于第三个数字,第三个数字小于第四个数字。

所以我需要检查1&lt; 2&gt; 4&lt; 3.(此向量不符合要求)我将获得的每个数字都将是&gt; 0并保证只在那里一次。

该过程需要推广到给定的n> 0和自然数。

2 个答案:

答案 0 :(得分:3)

v <- c(1, 2, 4, 3)
all(sign(diff(v)) == c(1, -1))
# [1] FALSE
# Warning message:
# In sign(diff(v)) == c(1, -1) :
# longer object length is not a multiple of shorter object length

我们可以放心地忽略警告信息,因为我们故意使用“回收”(这意味着c(1, -1)被隐式重复以匹配sign(diff(v))的长度。

编辑:考虑到@ digEmAll的评论,如果你想在序列的开头允许负面差异而不是正面差异,那么这个天真的改变就应该这样做:

diffs <- sign(diff(v))
all(diffs == c(1, -1)) || all(diffs == c(-1, 1))

答案 1 :(得分:1)

如果我们需要找出是否有其他积极的,负面的差异,那么

all(rle(as.vector(tapply(n, as.integer(gl(length(n),
         2, length(n))), FUN = diff)))$lengths==1)
#[1] TRUE

此外,正如@digEmAll评论和我的初始响应的变化

all(rle(sign(diff(n)) > 0)$lengths == 1) 

数据

n <- c(1, 2, 4, 3)