2017-10-19 144 views
0

我正在使用拨浪鼓包来做一些数据清理工作,我在数据集中考虑了第一个变量X.当我在第一个选项卡中输入“Data”选项卡时,它报告了一些基本的数据集,并且它说变量X有1243个缺失值。如果我使用sum(is.na(my_df[,1])),这也是我的价值。是否有不同类型的NA?

在接下来的选项卡,在“资源管理器”选项卡,当我检查“摘要”现在说,我刚才942倍的NA在变量X

我怎样才能使这些不同的数字感?我通过数据集手动浏览了一下,看了一些有NDA的行,这些NAs看起来都是一样的(我知道有时候会有不同类型的NAs)。

(边问题: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()中的“Data”选项卡(或等效地根据summary(ten_df))和根据“Explore”的62个NAs,选中摘要选项卡。

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

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输入变量”,并在其中给出反馈。怎么会这样?

+0

至于你身边的问题,'is.na'只能返回'TRUE/FALSE',参数'na.rm'无关。要看到这个尝试'x < - c(1:3,NaN,NA,4,5,NA);总和(is.na(X))'。至于报告缺失值的差异,很难说没有看到数据。我会信任'summary(X)'。 –

+0

@RuiBarradas谢谢! – billyboy

回答

3

?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" 

根据classNA也可能被不同的打印

现在回到你的问题,因为你不提供可重复的数据,我不能回答第一个,但作为为什么sum(is.na(my_df[,1]), na.rm = FALSE)sum(is.na(my_df[,1]),na.rm = TRUE),这是因为is.na(my_df[,1])只由TRUEFALSE组成,而不是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

+0

谢谢,迄今为止这是一个非常好的,深入的答案,我从你身上学到了很多!我希望我能够高兴,但只有在我有15个代表点后才能做到这一点;一旦我达到了,我会试着回顾追溯。我也上传了数据集,你可以看看它,这样第一个答案也可以回答吗? – billyboy

+0

不幸的是我无法从我的工作计算机上访问这个网站,但我的猜测是'sum(is.na(df [,1]))'会给你正确的答案,并且由于某种原因,发现要么不是最新的或只是估计。这将有助于通过代码命令真正看到矛盾,而不是你在标签中看到的东西:)。您也可以将您的数据集裁减到合理的大小并手动探索,但这已经不是那么大。 –

相关问题