我很难理解这段代码:
内部应用功能会提供包含 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()
}
答案 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
语句。