【问题标题】:replace <NA> with NA用 NA 替换 <NA>
【发布时间】:2014-11-30 23:44:24
【问题描述】:

我有一个包含条目的数据框;这些值似乎不被视为 NA,因为 is.na 返回 FALSE。我想将这些值转换为 NA 但找不到方法。

【问题讨论】:

  • 我猜你在谈论在 R 中做这件事?否则,na 是很模糊的……北美?不可用?
  • 是的,在 R 中很抱歉; NA代表缺失值
  • 通过将dput(your.data.frame[some.rows.that.contain.such.values,]) 的输出添加到您的问题来提供数据样本。
  • str(your.data.frame) 的结果也有助于我们了解列的存储方式。

标签: r replace na


【解决方案1】:

这可能是一个问题的两个类别是字符和因素。这应该循环一个 dtaframe 并将“NA”值转换为真正的&lt;NA&gt;,但仅适用于这两个类:

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}

【讨论】:

  • 感谢您的帮助。问题是我无法制作一个可重现的示例,在该示例中我同时获得了 NA 和 。 BondedDust 的功能允许我将 NA 和 转换为真正的 NA(它们在 is.na(df) 中显示为 TRUE),但我的 df 的结构显示包含 条目的变量被编码为因子而不是数字。
  • 我怀疑您不想将所有字符向量转换为数字,因此您可能只想将此转换应用于特定列:dfrm[targets] &lt;- lapply( dfrm[targets], make.true.NA) ; dfrm[targets] &lt;- lapply( dfrm[targets], as.numeric)
  • 是的,我必须转换为数字,但它只有在我先取消列出我的数据框时才有效。我不知道为什么它会显示为列表,但至少可以。
【解决方案2】:

使用dfr[dfr=="&lt;NA&gt;"]=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

【讨论】:

    【解决方案3】:

    您也可以使用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_na here 的更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 2020-02-22
      • 2019-03-14
      相关资源
      最近更新 更多