r - 为什么 na.omit 向空数据框添加一行?

我有一段代码正在做类似的事情

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 对我这样做?

最佳答案

这是因为 na.omit 有一个逻辑向量 omit(在它的代码中),它被设置为 FALSE 那些行 keep 和 TRUE 那些要删除的行。

但是,omit 最初设置为 FALSE,然后检查您的输入 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 的代码(可以通过 getS3method("na.omit", "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    

https://stackoverflow.com/questions/16539751/

相关文章:

qt - 平均共享 QML 行中的水平空间

perl - Mojolicious 应用程序中的并行请求

axapta - 根据用户输入启用/禁用向导的 FINISH 按钮

find - 如何为大量文件添加标题(空/非空)

google-drive-api - 我如何将文件上传到我拥有具有编辑权限的共享链接的 Google

itextsharp - 使用 iTextSharp.ShowTextAligned() 添加水印

haskell - Tree(Int,Int) 在 haskell 中是什么意思?

magento - 如何在 Magento 的 cms 页面上放置 php 语法

chef-infra - 是否有相当于 Berkshelf 的产品,但用于 Puppet 模块?

db2 - SQLRPGLE 中 OPEN 游标上的 SQL -302