r - complete.cases() 和 na.omit() 之间的差异

标签 r

在 R 中摆弄 Auto 数据集。

如果我运行以下命令:

auto = read.csv("Auto.csv", header=TRUE, na.strings="?")
summary(complete.cases(auto))

我得到以下信息:

   Mode   FALSE    TRUE    NA's 
logical       5     392       0

但是,当我运行它时,我得到了不同的结果:

auto1 = na.omit(auto)
dim(auto)  # returns [1] 397   9
dim(auto1) # returns [1] 392   9

为什么 complete.cases() 告诉我我没有 NA 但 na.omit() 似乎正在删除一些条目?

最佳答案

区别在于 complete.cases 返回一个长度与数据集行数相同的逻辑向量,而 na.omit 移除至少具有一个 NA。使用下面创建的可重现示例,

complete.cases(auto)
#[1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE

正如我们所见,它是一个没有 NA 的逻辑向量。它为没有任何 NA 的行提供 TRUE。因此,显然,对逻辑向量执行 summary 不会返回 NA。

summary(complete.cases(auto))
#  Mode   FALSE    TRUE    NA's 
#logical       4       6       0 

假设,我们需要得到与na.omit相同的结果,导出的逻辑向量应用于对原始数据集进行子集化

autoN <- auto[complete.cases(auto),]
auto1 <- na.omit(auto)
dim(autoN)
#[1] 6 2
dim(auto1)
#[1] 6 2

尽管结果会相似,na.omit 也返回一些属性

str(autoN)
#'data.frame':   6 obs. of  2 variables:
# $ v1: int  1 2 2 2 3 3
# $ v2: int  3 3 3 1 4 2
str(auto1)
#'data.frame':   6 obs. of  2 variables:
# $ v1: int  1 2 2 2 3 3
# $ v2: int  3 3 3 1 4 2
# - attr(*, "na.action")=Class 'omit'  Named int [1:4] 2 7 8 10
#  .. ..- attr(*, "names")= chr [1:4] "2" "7" "8" "10"

根据下面显示的基准,与 complete.cases 相比会更慢。

基准

set.seed(238)
df1 <- data.frame(v1 = sample(c(NA, 1:9), 1e7, replace=TRUE),
              v2 = sample(c(NA, 1:50), 1e7, replace=TRUE))
system.time(na.omit(df1))
#  user  system elapsed 
#   2.50    0.19    2.69 
system.time(df1[complete.cases(df1),])
#  user  system elapsed 
#  0.61    0.09    0.70 

数据

set.seed(24)
auto <- data.frame(v1 = sample(c(NA, 1:3), 10, replace=TRUE), 
                   v2 = sample(c(NA, 1:4), 10, replace=TRUE))

关于r - complete.cases() 和 na.omit() 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37537231/

相关文章:

r - ! R中的grep - 查找不匹配的项目

r - 当所有重要的是组成员的数量时,按组分配值

r - 基于反引号拼接排除多列(!!!)

windows - R:即使指定编码也无法读取unicode文本文件

r - 绕过R中循环内的错误

r - 当按 df 中具有不同长度组合的另一列在 R 中分组时,获取列中创建的所有组合的计数

python - 绘制 Matplotlib 中的缺陷

r - 在 R Shiny 服务器上保存临时文件

r - 使用 `fread` 对#N/A 的错误解释

r - Ubuntu 18.04 上的 RcppNumerical 和 RcppEigen 中的警告