为什么na.omit会为空数据框添加一行?

时间:2013-05-14 09:37:32

标签: r dataframe

我有一个类似

的代码
d <- load a data.frame, possible an empty one...
d <- na.omit(d)
if (NROW(d)>0) {
 do something...
}

这似乎是错误的,因为将na.omit应用于空数据框会为其添加一行:

data.frame()  
data frame with 0 columns and 0 rows

na.omit(data.frame())  
data frame with 0 columns and 1 rows

为什么na.omit对我这样做?

2 个答案:

答案 0 :(得分:4)

这是因为na.omit在其保持和{{1对于删除的那些行。

但是,在检查输入data.frame之前,omit最初设置为FALSE,要删除哪些行并更新FALSE的值。由于您的输入是空的data.frame,因此没有更新的值,TRUE保留先前设置的FALSE。然后,omit调用:

omit

在你的情况下是:

omit

给出:

na.omit

以下是object[!omit, , drop=FALSE] 的代码(可以通过data.frame()[TRUE, , drop=FALSE] 获得)。未为空data.frame运行的部分已注释掉。

# data frame with 0 columns and 1 rows

解决方案:

您可以使用na.omit.data.frame代替。

getS3method("na.omit", "data.frame")

答案 1 :(得分:1)

问题不在(必须)na.omit,而是索引没有行的data.frame。例如:

> DF <- data.frame()
> DF[TRUE, ]
data frame with 0 columns and 1 rows
> DF[1, ]
data frame with 0 columns and 1 rows
> DF
data frame with 0 columns and 0 rows

您无法真正索引data.frame并返回0行data.frame。

解决方法是使用条件逻辑:

if (!nrow(DF))
  do nothing
else 
  na.omit(DF) ... 

更好的解决方法是使用@ Arun的建议