[英]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.