R、 是否有任何函数能够只搜索并返回向量/列表/矩阵行/列中符合条件的第一个元素?

R、 是否有任何函数能够只搜索并返回向量/列表/矩阵行/列中符合条件的第一个元素?,r,R,例如,在标题之后,我只想得到(1,4,5,2,7,45,8)中的第一个偶数。我可以做循环,我可以使用which(),但它们似乎不够有效。你有更好的主意吗 谢谢大家! 要获得示例中的第一个偶数,可以使用%% > x <- c(1, 4, 5, 2, 7, 45, 8) > x[x %% 2 == 0][1] ## [1] 4 >x[x%%2==0][1] ## [1] 4 编辑 解决方案的计时结果: 1) 向量方法:tst[tst%%2==0][1] 2) firstEven(

例如,在标题之后,我只想得到(1,4,5,2,7,45,8)中的第一个偶数。我可以做循环,我可以使用which(),但它们似乎不够有效。你有更好的主意吗


谢谢大家!

要获得示例中的第一个偶数,可以使用
%%

> x <- c(1, 4, 5, 2, 7, 45, 8)
> x[x %% 2 == 0][1]
## [1] 4
>x[x%%2==0][1]
## [1] 4
编辑 解决方案的计时结果:

1) 向量方法:
tst[tst%%2==0][1]

2)
firstEven
Rcpp

3)
for
中断的循环

4)
match()

使用两个向量,
tst2
第一个为偶数,
tst
最后一个为偶数:

tst <- c(rep(1, 10000000), 2)
tst2 <- c(2, rep(1, 10000000))
因为循环有最佳情况和最坏情况,其他两种情况在这两种情况下都是相同的,但是使用
Rcpp
库要快得多

使用
break
语句停止搜索列表的For循环

for (i in c(1,4,5,2,7,45,8)) {
    if (i %% 2 == 0) {
        print(i);
        break;
    }
}

这是我第一次尝试使用Rcpp。我不知道C++,但是这似乎是可行的,因为它在找到第一偶数之后中断,并且显式for循环在编译的代码中运行,它应该非常快。
>   library(Rcpp)
>   cppFunction('
+           int firstEven(IntegerVector x) {
+               int n = x.size();
+               for(int i = 0; i < n; ++i) {
+                   if (x[i] % 2 == 0) {
+                       return x[i];
+                   }
+               }
+           }'
+           )
>   firstEven(c(1,2,3,4))
[1] 2
> 
>库(Rcpp)
>CPP函数('
+整数第一偶数(整数向量x){
+int n=x.size();
+对于(int i=0;i第一偶数(c(1,2,3,4))
[1] 2
> 

这绝对是一个简单的解决方案(例如,不检查向量中是否没有偶数)。

这会搜索整个列表,然后拉出第一个满意的,但是如果列表中没有偶数呢?
for
循环不返回任何内容,
i
将等于最后一个条目。您好,RScriv,谢谢您的回答!但是,您的方法似乎仍然会首先检查向量中的每个元素。我正在处理很多很长的向量,所以我希望R一旦找到一个合格的元素就会立即返回。那么6pool的答案在这里会更好。但是,如果列表中没有偶数,这种方法至少会返回
NA
。@RScriv for循环不会返回最后一个条目,因为有一个evenGreat测试,这是我当前使用的方法。我只是希望R大师已经在R中植入了类似的东西,或者没有?@user2961927 Yea明确地说,就像你说的match()函数是用C(或fortran?)编写的,并且会做同样的事情,也许会快一点,我试着检查一下,如果时间真的很重要,使用
Rcpp
,如果不是简单的基于向量的方法就可以了。对使用
是有风险的,因为它会根据搜索的深度提供非常可变的时间。太棒了!从现在开始,我将编写C++代码来处理类似的情况。起初,我简直不敢相信match.tst和match.tst2的运行时间如此接近,当我得到同样的结果时,我真的很沮丧。我认为在match()中一定有一个带中断的循环。@Clayton Stanley对于第一个近似,R在发送到C代码时速度较慢,因为它检查NAs等。正确性第一,速度第二。这是个不错的生活准则。太棒了!我认为这是最快的方法。不管你妈妈告诉你什么,尝试C++ 1。
>   library(Rcpp)
>   cppFunction('
+           int firstEven(IntegerVector x) {
+               int n = x.size();
+               for(int i = 0; i < n; ++i) {
+                   if (x[i] % 2 == 0) {
+                       return x[i];
+                   }
+               }
+           }'
+           )
>   firstEven(c(1,2,3,4))
[1] 2
>