我需要检查矢量的第一个数字是否小于第二个数字,第二个数字是否大于第三个数字,依此类推。到目前为止,我可以计算出这样的矢量数的差异:
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和自然数。
答案 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)