2017-10-19 145 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]))'會給你正確的答案,並且由於某種原因,發現要麼不是最新的或只是估計。這將有助於通過代碼命令真正看到矛盾,而不是你在標籤中看到的東西:)。您也可以將您的數據集裁減到合理的大小並手動探索,但這已經不是那麼大。 –

相關問題