使用R将数据集中的空白空间重新编码为NA

时间:2015-04-03 22:27:11

标签: r

我有一个包含大量空格的数据集(""代替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。只有在我使用该功能时才会发生错误。

我无法弄清楚原因。任何帮助将不胜感激。

由于

4 个答案:

答案 0 :(得分:3)

我不认为在这些操作中循环元素是一种很好的做法,因为你可以很容易地使它成为一个数组操作,这往往会更快。例如,

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 

答案 1 :(得分:3)

考虑使用具有type.convert参数的na.strings的一种选择,就像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

答案 2 :(得分:2)

这并没有直接回答你的问题,但是如果你只是想将“”改为NA,那么以下(更短)的代码就可以正常工作:

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

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

答案 3 :(得分:2)

另外两个答案指向您更好的练习,但可能有充分的理由解释可能使测试成功的原因。如果有任何缺失值,不要只测试不平等。

>  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。)第一个逻辑测试在测试连词时解决了问题,因为第二项值不重要,所以第二个子句永远不会被评估,如果有&#39萨纳

>   FALSE && NA
[1] FALSE