我有一个类似
的代码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对我这样做?
答案 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的建议