0

哪个数量的 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);

识别所有 >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))]]

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

4

2 回答 2

4

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

x这给出了大于 5 并且出现在 position 之后的所有元素的索引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

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

于 2013-03-01T04:15:01.760 回答
1

使用函数式编程提取索引的替代版本:

> 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

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

于 2013-03-01T10:07:11.033 回答