我有一个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>
,而不是NA
在NA
案例中,我有一个解决方案HERE。
答案 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
,其中包含许多函数,例如mean
,sum
和&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))