我有一个包含大量空格的数据集(""代替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] != ""
某些i
和j
的值时,它会正确评估为TRUE/FALSE
。只有在我使用该功能时才会发生错误。
我无法弄清楚原因。任何帮助将不胜感激。
由于
答案 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