这是因为na.omit
有一个逻辑向量omit
(在其代码中)被设置FALSE
为保留TRUE
那些行和删除那些行。
但是,omit
在检查您的输入 data.frame 以了解要删除哪些行并更新omit
. 由于您的输入是一个空的 data.frame,因此没有更新的值并omit
保留之前设置的 FALSE。然后,na.omit
调用:
object[!omit, , drop=FALSE]
在您的情况下是:
data.frame()[TRUE, , drop=FALSE]
这使:
# data frame with 0 columns and 1 rows
这是na.omit.data.frame
(可以通过do获得getS3method("na.omit", "data.frame")
)的代码。未为您的空 data.frame 运行的部分被注释掉。
n <- length(object)
omit <- FALSE
vars <- seq_len(n) # equals integer(0) in your case
for (j in vars) { # the loop is not run at all
# x <- object[[j]]
# if (!is.atomic(x))
# next
# x <- is.na(x)
# d <- dim(x)
# if (is.null(d) || length(d) != 2L)
# omit <- omit | x
# else for (ii in 1L:d[2L]) omit <- omit | x[, ii]
# }
xx <- object[!omit, , drop = FALSE]
# if (any(omit > 0L)) { # this is also not run
# temp <- setNames(seq(omit)[omit], attr(object, "row.names")[omit])
# attr(temp, "class") <- "omit"
# attr(xx, "na.action") <- temp
# }
xx
解决方案:
你可以complete.cases
改用。
DF <- data.frame()
DF[complete.cases(DF), ]
# data frame with 0 columns and 0 rows
DF <- data.frame(x=1:2, y=c(2,NA))
DF[complete.cases(DF), ]
# x y
# 1 1 2