簡體   English   中英

complete.cases()和na.omit()之間的差異

[英]Discrepancy between complete.cases() and na.omit()

在搞亂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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM