我正在使用拨浪鼓包进行一些数据清理,并且我正在考虑数据集中的第一个变量 X。它报告,当我在第一个选项卡“数据”选项卡中执行操作时,我得到了数据集的一些基本信息,它表示变量 X 有 1243 个缺失值。这也是我使用
sum(is.na(my_df[,1]))
时获得的值。
在下一个选项卡“探索”选项卡上,当我检查“摘要”时,它现在显示变量 X 中只有 942 个 NA。
我如何理解这些不同的数字?我手动浏览了我的数据集,并查看了一些具有 NA 的行,并且这些 NA 看起来都相同(我知道有时存在不同类型的 NA)。
(附带问题:
sum(is.na(my_df[,1]), na.rm = FALSE)
和 sum(is.na(my_df[,1]),na.rm = TRUE)
也都产生相同的数字 1243,为什么?我本以为会有一个给我 length(my_df[,1])-1243
。)
编辑这是存在此问题的数据集:https://wetransfer.com/downloads/cf454b2c12857a4e3770102a7222422f20171019153755/516fb0。
其中的数字略有不同,不是 1243,而是根据 Rattle() 中的“数据”选项卡(或者等效地根据
summary(ten_df)
)我们有 88 个 NA,根据“探索”有 62 个 NA检查“摘要”选项卡。
但现在我怀疑我的数据集已损坏,因为在上传完整的数据集之前,我最初只想上传一个说明性专栏。但是当我执行的时候
ten_df = read.csv("ten.csv",sep=";")
my_df = as.data.frame(ten_df[,3])
因为我想用
var2
查看第三列,并且 my_df
是我最初想要上传的内容,所以最后一个命令返回错误
Warning messages:
1: In rep(no, length.out = length(ans)) :
'x' is NULL so the result will be NULL
此外,当随后选择 my_df 用拨浪鼓分析它时,拨浪鼓在底部提供反馈的栏中显示“0 输入变量”。怎么会这样?
?NA
NA 是长度为 1 的逻辑常量,其中包含缺失值 指标。 NA 可以强制为除原始向量之外的任何其他向量类型。 还有常量 NA_integer_、NA_real_、NA_complex_ 和 支持缺失的其他原子向量类型的 NA_character_ 值:所有这些都是 R 语言中的保留字。
class(NA) # "logical"
class(NA_integer_) # "integer"
class(NA_real_) # "numeric"
class(NA_complex_) # "complex"
class(NA_character_) # "character"
is.na(NA) # TRUE
is.na(NA_integer_) # TRUE
is.na(NA_real_) # TRUE
is.na(NA_complex_) # TRUE
is.na(NA_character_) # TRUE
identical(NA,NA_integer_) # FALSE
identical(NA,NA_real_) # FALSE
identical(NA,NA_complex_) # FALSE
identical(NA,NA_character_) # FALSE
identical(NA_character_,as.character(NA)) # TRUE
identical(NA_real_,as.numeric(NA)) # TRUE
identical(as.logical(NA_real_),NA) # TRUE
所以 NA 是
logical
。那么为什么我们几乎到处都使用 NA 而不用担心类呢?因为强制规则:
class(c(NA,1)[1]) # "numeric"
identical(c(NA,1),c(NA_real_,1)) # TRUE
c(NA_character_,1) # [1] NA "1"
根据
class
,NA
的打印方式也可能不同
现在回到你的问题,我无法回答第一个问题,因为你没有提供可重现的数据,但至于为什么
sum(is.na(my_df[,1]), na.rm = FALSE)
和sum(is.na(my_df[,1]),na.rm = TRUE)
,这是因为is.na(my_df[,1])
仅由TRUE
和FALSE
组成,不是 NA
s。
你也可以尝试
length(na.omit(my_df[,1]))
。
编辑:
data.frame
的给定列仅包含一个类的元素,因此同一列中不会有不同的 NA_character_
和 NA_real_
。
经常发生的事情是,您将拥有一些值为
"NA"
的字符串,您当然不应该期望 is.na
检测到这些字符串。在这些情况下,您可以使用 df[df == "NA"] <- NA
在 NA
中使用常规
"NA"
而不是
data.frame
字符串