什么完全嵌套的应用函数在R中做什么?

时间:2014-01-05 14:37:52

标签: r

我很难理解这段代码:

内部应用功能会提供包含 NAs indata 行,但我不知道外部应用函数的作用是什么?为什么总结列?

这段代码用于从 indata 中删除 NAs

na.rows = which( apply( apply( indata, 1, is.na ), 2, sum ) > 0 )   
if( length( na.rows ) > 0 )
    {
        indata = indata[ -na.rows, ]
        cat( "\n!!Removed NAs from data set!!\n" ); flush.console()
    }

2 个答案:

答案 0 :(得分:3)

创建一个小例子并将你的申请分成两部分来看看会发生什么?

## a samm reproducible example
> set.seed(1)
> (indata <- matrix(sample(c(1,NA),9,rep=TRUE),ncol=3))
     [,1] [,2] [,3]
[1,]    1   NA   NA
[2,]    1    1   NA
[3,]   NA   NA   NA
## first apply
> (res <- apply( indata, 1, is.na ))
      [,1]  [,2] [,3]
[1,] FALSE FALSE TRUE
[2,]  TRUE FALSE TRUE
[3,]  TRUE  TRUE TRUE
## second apply
> apply(res, 2, sum ) 
[1] 2 1 3

您的代码计算每列的非缺失值的数量。可以用矢量化方式编写(更有效):

rowSums(is.na(indata))
[1] 2 1 3

答案 1 :(得分:2)

na.rows = which( apply( apply( indata, 1, is.na ), 2, sum ) > 0 )

在我看来,上面的代码找到了任何元素为NA的行。内部循环找到NA,并返回一个布尔矩阵。外部应用循环对行进行求和,从而得出每行的NA数。 > 0将此转换为逻辑向量,which依次将此转换为行中任何元素为NA的索引。

请注意,此代码可以更简单:

na.rows = which(apply(is.na(indata), 1, any))

坚持布尔矢量使其更简单。您上面的所有代码都可以替换为:

na.rows = apply(is.na(indata), 1, any))
indata = indata[!na.rows]
if(any(na.rows)) cat( "\n!!Removed NAs from data set!!\n" ); flush.console()

这消除了外部apply循环和which语句。