【问题标题】:Are there different types of NAs?是否有不同类型的 NA?
【发布时间】:2017-10-19 10:16:35
【问题描述】:

我正在使用 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。)


EDIT 以下是存在此问题的数据集:https://wetransfer.com/downloads/cf454b2c12857a4e3770102a7222422f20171019153755/516fb0

其中的数字略有不同,根据 rattle() 中的“数据”选项卡(或等效地,根据 summary(ten_df)),我们有 88 个 NA,而不是 1243,根据“探索”,我们有 62 个 NA " 带有选中的摘要选项卡。

但现在我怀疑我的数据集已损坏,因为在上传完整的数据集之前,我原本只想上传一个说明性的列。但是当我执行时

ten_df = read.csv("ten.csv",sep=";") 
my_df = as.data.frame(ten_df[,3])

因为我想看第三列var2my_df是我本来想上传的,所以最后一个命令返回错误

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

此外,当随后选择 my_df 以用嘎嘎声对其进行分析时,嘎嘎嘎在给出反馈的底部栏中会显示“0 输入变量”。这怎么可能?

【问题讨论】:

  • 至于你的附带问题,is.na 只能返回TRUE/FALSE,参数na.rm 无关紧要。要查看此内容,请尝试x <- c(1:3, NaN, NA, 4, 5, NA); sum(is.na(x))。至于缺失值报告值的差异,不看数据很难判断。我会相信summary(X)
  • @RuiBarradas 谢谢!

标签: r dataframe na missing-data rattle


【解决方案1】:

?NA

NA 是一个长度为 1 的逻辑常数,其中包含一个缺失值 指标。 NA 可以强制转换为除 raw 之外的任何其他向量类型。 还有常量 NA_integer_、NA_real_、NA_complex_ 和 支持缺失的其他原子向量类型的 NA_character_ values:所有这些都是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"

根据classNA 的打印方式也可能不同

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

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

编辑:

data.frame 的给定列只有一个类的元素,因此同一列中不会有不同的 NA_character_NA_real_

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

【讨论】:

  • 谢谢,到目前为止,这是一个非常好的、深入的答案,我从你那里学到了很多!我希望我可以投票,但我只有在获得 15 个代表点后才能这样做;一旦达到这一点,我将尝试回顾性地投票。我也上传了数据集,你看看能不能让第一个答案也能回答?
  • 不幸的是,我无法从我的工作计算机访问该网站,但我猜sum(is.na(df[,1])) 会给你正确的答案,并且由于某种原因,你找到的替代值要么没有出现迄今为止或只是估计。通过代码命令而不是您在选项卡中看到的内容,这将有助于真正看到矛盾:)。您也可以将数据集切割成合理的大小并手动探索它,它已经不是那么大了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2011-03-27
  • 2012-06-05
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多