是否有不同类型的 NA?

bil*_*boy 2 r missing-data dataframe na rattle

我正在使用 Rattle 包进行一些数据清理,并且我正在考虑数据集中的第一个变量 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])
Run Code Online (Sandbox Code Playgroud)

由于我想查看第三列,var2并且my_df是我最初想要上传的内容,因此最后一个命令返回错误

Warning messages:
1: In rep(no, length.out = length(ans)) :
  'x' is NULL so the result will be NULL
Run Code Online (Sandbox Code Playgroud)

此外,当随后选择 my_df 以使用 Rattle 对其进行分析时,Rattle 在其提供反馈的底部栏中显示“0 输入变量”。怎么会这样?

Moo*_*per 7

?NA

NA 是一个长度为 1 的逻辑常数,其中包含一个缺失值指示符。NA 可以被强制转换为除 raw 之外的任何其他向量类型。还有其他原子向量类型的常量 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
Run Code Online (Sandbox Code Playgroud)

所以 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"
Run Code Online (Sandbox Code Playgroud)

取决于class,NA也可能以不同的方式打印

现在回到你的问题,我无法回答第一个,因为你没有提供可重复的数据,但至于为什么sum(is.na(my_df[,1]), na.rm = FALSE)and sum(is.na(my_df[,1]),na.rm = TRUE),这是因为 is.na(my_df[,1])它只由TRUEand 组成FALSE,而不是NAs 。

你也可以试试length(na.omit(my_df[,1]))

编辑:

一个给定的列data.frame只有一个类的元素,所以你不会有不同NA_character_,并NA_real_在同一列。

然而,经常发生的事情是您将拥有一些值为 的字符串"NA",您当然不应该期望is.na检测到这些字符串。在这些情况下,您可以使用df[df == "NA"] <- NA常规NAs 而不是"NA"字符串data.frame