什么数字大于x并且在位置y之后下降

时间:2013-03-01 03:59:34

标签: r

x的数量是多少? 5,落后于第10位?这是第11位的数字。 但我发现自己写了一个很长的代码来得到答案,我想知道是否有更快的方法。

x <- c(5,7,3,6,9,4,1,4,7,10,8,5,7,9,7,1, 8, 4, 4,9);

确定所有数字的位置&gt; 5将其命名为x1:

x1 <- which(x>5);

确定在第10个位置之后发生的第一个位置数(x1):

first(which(x1 >10))

这标识了x1的位置6;

在原始向量(x)中识别该数字的位置:

x1[first(which(x1 >10))]; 

现在我们在原始向量(x)中得到了我们想要的值的位置,并且此代码提取了我们想要的值:

x[x1[first(which(x1 >10))]]

这似乎是一个很长的代码来回答一个简单的问题,你知道更短/更简单的方法来获得相同的结果吗?

2 个答案:

答案 0 :(得分:4)

一些非常简单的索引和子索引有什么问题?

这使得x中所有元素的索引大于5,并且位于10之后:

> which(x > 5 & seq_along(x) > 10)
[1] 11 13 14 15 17 20

所以最终答案是

> which(x > 5 & seq_along(x) > 10)[1]
[1] 11

> head(which(x > 5 & seq_along(x) > 10), 1)
[1] 11

这里使用的技巧是使用x函数生成索引seq_along()的向量。这样我们就可以在一个逻辑语句中生成所有匹配项,然后选择第一个匹配项。

如果要提取已识别的元素,则:

> want <- which(x > 5 & seq_along(x) > 10)[1]
> x[want]
[1] 8

[目前尚不清楚您是否想要确定哪个元素符合您的标准或该元素的价值。]

答案 1 :(得分:1)

使用functional编程提取索引的替代版本:

> Find(function(y) x[y] > 5 & y > 10, seq_along(x))
[1] 11

或提取元素:

> x[Find(function(y) x[y] > 5 & y > 10, seq_along(x))]
[1] 8

与简单的索引相比,不知道性能的差异。