是否有不同类型的NA?

时间:2017-10-19 10:16:35

标签: r dataframe na missing-data rattle

我正在使用拨浪鼓包进行一些数据清理,我认为我的数据集中的第一个变量X.它报告,当我在第一个选项卡中执行“数据”选项卡时,我得到了一些基本的数据集,并且它表示变量X有1243个缺失值。这也是我使用sum(is.na(my_df[,1]))时获得的价值。

在下一个标签上,“浏览”标签,当我选中“摘要”时,它现在表示我在变量X中只有942个NA。

我如何理解这些不同的数字?我在我的数据集中手动浏览了一下,看了一些有NAs的行,那些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,根据拨浪鼓()中的“数据”选项卡(或等效地,根据summary(ten_df)),我们有88个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输入变量”,它会给出反馈。怎么会这样?

1 个答案:

答案 0 :(得分:3)

?NA

  

NA是长度为1的逻辑常量,包含缺失值   指示符。除了原始NA之外,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"

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

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

您也可以尝试NA

修改

length(na.omit(my_df[,1]))的给定列只包含一个类的元素,因此您在同一列中不会有不同的data.frameNA_character_

然而,经常发生的事情是,您有一些价值为NA_real_的字符串,您当然不应期望"NA"来检测这些字符串。在这些情况下,您可以使用is.nadf[df == "NA"] <- NA

中定期NA代替"NA"字符串