2014-10-06 105 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