如何在R中用0替换<NA>值?

5

我有一个数据框,其中的一些列具有NA值。我想将<NA>替换为零。我该怎么做?

实际上,这里展示的mydate不是我的原始数据。原始数据太大了,无法在此处显示。

mydata = read.spss('mydata.sav', use.value.labels = TRUE, to.data.frame = TRUE, max.value.labels = Inf, trim.factor.names = FALSE, trim_values = FALSE, reencode = "UTF-8")


> mydata
   Q_16_O3 Q_16_O4 Q_16_O5 Q_16_O6 Q_16_O7 Q_16_O8 Q_16_O9
10    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
11    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
12    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
13    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
14    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
15    Trem    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
16    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
17    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
18    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
19    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>
20    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>    <NA>


    str(mydata)

    'data.frame':   11 obs. of  7 variables:

    $ Q_16_O3: Factor w/ 10 levels "Ônibus","Vans",..: NA NA NA NA NA 4
 NA NA NA NA ...

    $ Q_16_O4: Factor w/ 10 levels "Ônibus","Vans",..: NA NA NA NA NA
 NA NA NA NA NA ...

    $ Q_16_O5: Factor w/ 10 levels "Ônibus","Vans",..: NA NA NA NA NA
 NA NA NA NA NA ...

    $ Q_16_O6: Factor w/ 10 levels "Ônibus","Vans",..: NA NA NA NA NA
 NA NA NA NA NA ...

    $ Q_16_O7: Factor w/ 10 levels "Ônibus","Vans",..: NA NA NA NA NA
 NA NA NA NA NA ...

    $ Q_16_O8: Factor w/ 10 levels "Ônibus","Vans",..: NA NA NA NA NA
 NA NA NA NA NA ...

    $ Q_16_O9: Factor w/ 10 levels "Ônibus","Vans",..: NA NA NA NA NA
 NA NA NA NA NA ...

我想使用freq函数,因此不能更改其结构(mydata)。

PS:我的问题是<NA>,而不是NA。在NA情况下,我有一个解决方案,在这里


数据类型是什么?使用 lapply(mydata,summary) 进行检查,并将结果发布到您的答案中。 - Alex Brown
2
<NA>data.frame(通过print.data.frame显示)中对于字符向量只是NA。它仍然很可能只是一个普通的NA,就像对于data.frame(text=c("a",NA))一样。你先尝试了另一个解决方案吗? - thelatemail
我很想知道:这些情况中哪一个是真的?你的<NA>值真的是字符,还是因子中的NA值? - Ben Bolker
1个回答

18

对于包含数字的任何数据结构X,请使用

X[is.na(X)] <- 0

您的问题似乎有点混乱 - 您指出您的意思是<NA>而不是NA,但没有解释<NA>类型是什么。

如果您指的是字符串"<NA>",那么

X[X=="<NA>"] <- "0"

如果您的数据框中有混合数据类型,请也要检查一下:

X[is.character(X) & X=="<NA>"] <- "0"

这在数值情况下更加有用。

X[is.numeric(X) & is.na(X)] <- 0

这是R语言中处理缺失数据的一种常见习惯用语,虽然你也应该查看参数na.rm = TRUE,它可以被许多函数如meansum等接受。

对于因子(factor)而言,这种策略会失败,因为你无法通过给因子赋值来添加新的因子水平。我没有使用read.spss函数,但是根据文档,我建议你在调用时添加参数use.value.labels = FALSE,以避免首先创建因子。

在你的特定情况下,整个数据框的类型都是相同的(即因子)。这意味着可以安全地转换为字符矩阵。

> class(mydata[[1]])
"factor"
> mydataM <- as.matrix(mydata) 
> mode(mydataM)
"character"

现在你可以替换NA值

X[is.character(X) & X=="<NA>"] <- "0"

在一般情况下,如果你的数据中混杂着一些不必要的因子列和其他类型的列,你需要做一些更复杂的处理。

myDataM=as.data.frame(lapply(x,
  function(x)if(class(x)=="factor")as.character(x)else x))

它不起作用...我想在我的新数据的某些列中使用freq函数...我会改进我的问题! - MAOC
谢谢,好的,这些是因子变量。你是正确的,它不会起作用,因为你不能像这样向因子添加级别。 - Alex Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接