2014-10-06 200 views
3

我有一個數據框包含條目;看起來這些值不被視爲NA,因爲is.na返回FALSE。我想將這些值轉換爲NA,但找不到方法。替換<NA>與NA

+0

我猜你在談論中的R這樣做呢?否則,na很模糊......北美?無法使用? – 2014-10-06 16:48:59

+0

對不起在R; NA代表缺失值 – user34771 2014-10-06 16:55:43

+2

通過將dput(your.data.frame [some.rows.that.contain.such.values,])的輸出添加到您的問題來提供您的數據樣本。 – Roland 2014-10-06 17:05:47

回答

1

這可能是一個問題的兩個類是字符和因素。這應該循環通過dtaframe並轉換「NA」值到真<NA>的,但只是對於那些兩類:

make.true.NA <- function(x) if(is.character(x)||is.factor(x)){ 
            is.na(x) <- x=="NA"; x} else { 
            x} 
df[] <- lapply(df, make.true.NA) 

(未測試在不存在的數據示例的)使用的形式爲:df_name[]將嘗試保留原本數據幀的結構,否則將失去其類屬性。我看到ujjwal認爲你的NA的拼寫已經側翼「<>」字,所以你可以試試這個功能比較一般:

make.true.NA <- function(x) if(is.character(x)||is.factor(x)){ 
            is.na(x) <- x %in% c("NA", "<NA>"); x} else { 
            x} 
+0

感謝您的幫助。問題是,我沒有設法做出一個可重複的例子,在這個例子中我獲得了NA和。 BondedDust的功能允許我在真NA中轉換NA和(它們都以is.na(df)顯示全部TRUE),但是我的df的結構顯示包含條目的變量被編碼爲因子,而不是數字。 – user34771 2014-10-06 20:32:51

+0

我懷疑你不想將所有字符向量轉換爲數字,所以你可能想將這個轉換應用到特定的列:'dfrm [targets] < - lapply(dfrm [targets],make.true.NA) ; dfrm [targets] < - lapply(dfrm [targets],as.numeric)' – 2014-10-06 21:01:44

+0

是的,我必須轉換爲數字,但它只有在我首先取消我的數據框時纔有效。我不知道爲什麼它出現在列表中,但至少可以。 – user34771 2014-10-07 06:45:08

2

使用dfr[dfr=="<NA>"]=NA其中dfr是你的數據幀。

例如:

> dfr<-data.frame(A=c(1,2,"<NA>",3),B=c("a","b","c","d")) 

> dfr 
    A B 
1 1 a 
2 2 b 
3 <NA> c 
4 3 d 

> is.na(dfr) 
     A  B 
[1,] FALSE FALSE 
[2,] FALSE FALSE 
[3,] FALSE FALSE 
[4,] FALSE FALSE 

> dfr[dfr=="<NA>"] = NA     **key step** 

> is.na(dfr) 
     A  B 
[1,] FALSE FALSE 
[2,] FALSE FALSE 
[3,] TRUE FALSE 
[4,] FALSE FALSE 
0

您可以用naniar包也這麼做,使用replace_with_na和相關功能。


dfr <- data.frame(A = c(1, 2, "<NA>", 3), B = c("a", "b", "c", "d")) 

library(naniar) 
# dev version - devtools::install_github('njtierney/naniar') 
is.na(dfr) 
#>   A  B 
#> [1,] FALSE FALSE 
#> [2,] FALSE FALSE 
#> [3,] FALSE FALSE 
#> [4,] FALSE FALSE 

dfr %>% replace_with_na(replace = list(A = "<NA>")) %>% is.na() 
#>   A  B 
#> [1,] FALSE FALSE 
#> [2,] FALSE FALSE 
#> [3,] TRUE FALSE 
#> [4,] FALSE FALSE 

# You can also specify how to do this for many variables 

dfr %>% replace_with_na_all(~.x == "<NA>") 
#> # A tibble: 4 x 2 
#>  A  B 
#> <int> <int> 
#> 1  2  1 
#> 2  3  2 
#> 3 NA  3 
#> 4  4  4 

你可以閱讀更多有關使用replace_with_nahere