如何在R?</na>中用零替换<na>值

时间:2014-05-15 22:19:48

标签: r import

我有一个data.frame,有些列有NA个值。我想用零替换<NA> s。我是怎么做到的?

实际上,这里显示的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>,而不是NANA案例中,我有一个解决方案HERE

1 个答案:

答案 0 :(得分:8)

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

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

你的问题似乎有点混乱 - 你已经表明你的意思是<NA>而不是NA,而没有解释 type <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和&amp; c 。会接受。

此策略将失败,因为您无法通过分配因子的值来添加新的因子级别。我没有使用过read.spss,但是查看documentation,我建议您在调用中添加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))