【问题标题】:Recoding empty spaces in a dataset to NA using R使用 R 将数据集中的空格重新编码为 NA
【发布时间】:2015-04-04 18:43:31
【问题描述】:

我有一个包含大量空格的数据集(“”代替 NA)。我想将这些空格重新编码为 NA(我想使用一些插补包,例如来自 R 生态系统的 Mice)。为此,我正在尝试以下代码:

emptyToNA <- function(x){
  y <- data.frame(matrix(NA,nrow=nrow(x),ncol=ncol(x)))
  for(i in ncol(x)){
    for(j in nrow(x)){
      if(x[j,i] != ""){
        y[j,i] = x[j,i]
      }
    }
  }
  return(y)
}

但是,我收到此错误:Error in if (x[j, i] != "") { : missing value where TRUE/FALSE needed。所以我认为if 子句中的条件没有正确评估。

但是当我只检查data[j,i] != "" 中的ij 的某些值时,它的计算结果正确为TRUE/FALSE。该错误仅在我使用该功能时出现。

我不知道为什么。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    我不认为循环遍历元素是这类操作的好习惯,因为您可以轻松地将其设为数组操作,这往往会快得多。例如,

    y = x
    y[x==""] = NA
    

    会做你想做的事。例如,

    > x = matrix("", 3, 3)
    > y = x
    > y[x==""] = NA
    > y
           [,1] [,2] [,3]
      [1,] NA   NA   NA  
      [2,] NA   NA   NA  
      [3,] NA   NA   NA 
    

    【讨论】:

      【解决方案2】:

      考虑使用具有na.strings 参数的type.convert 的一个选项,就像read.table 和家庭一样。

      这是一个例子:

      A <- B <- data.frame(
        v1 = c("", "A", "B x"),
        v2 = c(" ", "", "X"),
        v3 = c("Z", "     ", "y"))
      A # and B
      #    v1 v2    v3
      # 1            Z
      # 2   A         
      # 3 B x  X     y
      
      ## Convert just "", but not spaces
      A[] <- lapply(A, function(x) {
        type.convert(as.character(x), na.strings = "")
      })
      
      A
      #     v1   v2    v3
      # 1 <NA>          Z
      # 2    A <NA>      
      # 3  B x    X     y
      

      这是我在写 makemeNA 作为我的仅限 GitHub 的 "SOfun" package 的一部分时采用的方法。

      这里有几个例子:

      library(SOfun)
      makemeNA(B, "", FALSE)               ## Just ""
      #     v1   v2    v3
      # 1 <NA>          Z
      # 2    A <NA>      
      # 3  B x    X     y
      makemeNA(B, "^[ ]+$", fixed = FALSE) ## Both "" and spaces
      #     v1   v2   v3
      # 1 <NA> <NA>    Z
      # 2    A <NA> <NA>
      # 3  B x    X    y
      

      【讨论】:

      • 感谢大家分享他们的意见/cmets/suggestions。以上所有的cmets对我的理解都有帮助。再次感谢。
      【解决方案3】:

      其他两个答案为您指明了更好的做法,但可能有充分的理由解释什么可以使测试成功。如果有任何缺失值,不要只测试不等式。

      >  if( NA ){print(TRUE)}
      Error in if (NA) { : missing value where TRUE/FALSE needed
      > if( TRUE ){print(TRUE)}
      [1] TRUE
      

      使用

      if ( !is.na(x[j,i]) && x[j,i] != ""){ y[j,i] = x[j,i] }
      

      这样,当x[j,i] 为 NA 时,不等式测试不会引发错误。 (没有任何事情等于或不等于 NA。)第一个逻辑测试解决了测试连词时的问题,因为第二个项目的值是什么并不重要,因此如果存在 NA,则永远不会评估第二个子句。

      >   FALSE && NA
      [1] FALSE
      

      【讨论】:

        【解决方案4】:

        这并不能直接回答您的问题,但是如果您只是想将 "" 更改为 NA,则以下(较短的)代码可以正常工作:

        让我们说 df 是你的数据框:

        df[df==""]<- NA
        df
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-10
          • 2021-09-15
          • 2013-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多