R:向量筛选

来源:互联网 发布:字符串拼接函数 js 编辑:程序博客网 时间:2024/06/05 20:51


    筛选是R中很关键的运算。我们对向量使用函数——它也是向量化的另一个例子,与你看到的其他向量化一样。

 

►生成筛选索引

> z <- c( 5, 2, -3, 8 )

> z*z > 8

[1]  TRUE FALSE  TRUE  TRUE

> z[ z*z > 8 ]

[1]  5 -3  8

#使用Z筛选自身

> z <- c( 5, 2, -3, 8 )

> y <- c( 1, 2, 30, 5 )

> y[ z*z > 8 ]

[1]  1 30  5

#使用向量Z筛选另一个向量y的索引。

 

►使用subset()函数筛选

    也可以使用subset()函数做筛选。当对向量使用该函数时,它与普通的筛选方法的区别在于处理NA值的方式上。

> x <- c( 6, 1:3, NA, 12 )

> x[ x > 5 ]

[1]  6 NA 12

> subset( x, x > 5 )

[1]  6 12

    我们使用前一节提到的普通筛选方法,R会认为“x[5]是未知的,因此其平方是否大于5同样是未知的。”但也许你不希望NA出现在结果中。当你希望在结果中剔除NA值时,使用subset()将免去自己移除NA的麻烦。

 

►使用which()函数

    筛选是从向量z中提取满足一定条件的元素。但是,在某些情况下,我们希望找到z中满足条件元素所在的位置。此时可以使用which(),如下所示:

> z <- c( 5, 2, -3, 8 )

> which( z*z > 8 )

[1] 1 3 4

注:结果表明z中的第一、第三和第四元素平方大于8。

    which()有一个非常方便(尽管有点浪费)的用法,是在一个向量中找出满足一定条件的元素首次出现的位置。代码如下:

> first <- function( x ) return ( which( x==1 )[1] )

注:查询1第一次出现的位置。代码等同于:

first <- function( x ){

    for( i in 1:length( x ) )

        if( x[i] == 1 )

            break

    return ( i )

}

    调用which()产生x中所有1的索引。这些索引将以向量形式给出,然后我们取该向量中的第一个元素,即是第一个1的索引。这一代码更加简洁。但另一方面,它也比较浪费,因为它找出了x中所有的1,而我们只需要第一个。因此,尽管它是向量化方法,可能更快,但如果x中第一个1出现在靠前的位置,则此方法实际上要慢一些。

 

►向量化的ifelse()函数

    除了多数语言中常见的if-then-else结构,R还有一个向量化的版本:ifelse()函数。它的形式如下:

ifelse( b, u, v )

    其中b是一个布尔值向量,而u和v是向量。该函数返回的值也是向量,如果b[i]为真,则返回值的第i个元素为u[i],如果b[i]为假,则返回值的第i个元素为v[i]。

> x <- 1 : 10

> y <- ifelse( x %% 2 == 0, 5, 12 )

> y 

[1] 12  5 12  5 12  5 12  5 12  5

    ifelse()相对于标准的if-then-else结构的优点是,它是向量化语句,因此有可能快很多。



 

0 0
原创粉丝点击