在 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/