正在使用R中的自动数据集。
如果我运行以下内容:
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()似乎正在删除一些条目?
答案 0 :(得分:6)
区别在于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))