R: is.na()函数无法识别NA值

3

我有一个数据集,仅仅通过查看数据集就可以清楚地看到其中明显的NA值。

 > dput(bmi.cig)
structure(list(MSI.subset.BMI = structure(c(4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 1L, 2L, 3L, 3L, 1L, 3L, 3L, 1L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("0", "1", "2", 
"NA"), class = "factor"), MSI.subset.Cigarette = structure(c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 1L, 2L, 1L, 2L, 
2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("1", 
"2", "NA"), class = "factor")), .Names = c("MSI.subset.BMI", 
"MSI.subset.Cigarette"), row.names = c(NA, 30L), class = "data.frame")


> head(bmi.cig)
  MSI.subset.BMI MSI.subset.Cigarette
1             NA                   NA
2             NA                   NA
3             NA                   NA
4             NA                   NA
5             NA                   NA
6             NA                   NA

我希望删除任何一列中含有NA值的行,因此我正在使用ForImp软件包中的列表删除函数ld。然而,R并未识别到NA值。

is.na(bmi.cig$MSI.subset.BMI)

我理解

    > is.na(bmi.cig$MSI.subset.BMI)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[26] FALSE FALSE FALSE FALSE FALSE

所以一旦我使用ld函数,就只会得到一个空的数据集。


3
列中的值不是NA,而是字符串"NA"。请参见levels(bmi.cig$MSI.subset.BMI) - nicola
好的。我应该如何将它们从“NA”字符串更改为NA?我的目标只是使用ld函数并执行列表删除。 - Adrian
2个回答

5

这是因为这些列是因子,而级别是"NA"。也就是说,尝试使用

data <- structure(list(MSI.subset.BMI = structure(c(4L, 4L, 4L, 4L, 4L, 
+ 4L, 4L, 4L, 4L, 4L, 4L, 1L, 2L, 3L, 3L, 1L, 3L, 3L, 1L, 4L, 4L, 
+ 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("0", "1", "2", 
+ "NA"), class = "factor"), MSI.subset.Cigarette = structure(c(3L, 
+ 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 1L, 2L, 1L, 2L, 
+ 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("1", 
+ "2", "NA"), class = "factor")), .Names = c("MSI.subset.BMI", 
+ "MSI.subset.Cigarette"), row.names = c(NA, 30L), class = "data.frame")
> class(blah[,1])

data[,1]=="NA"

NA实际上是字符(class("NA")),而非类logical,就像class(NA)一样。


我明白了。我如何将整个数据集中的“NA”更改为“NAs”呢? - Adrian
1
如果你想过滤掉NA值,可以像这样做: msi[msi$MSI.subset.BMI != "NA" & msi$MSI.subset.BMI != "NA",],这应该适用于你的数据框,并留下你想要的内容。 - jed
2
取决于您想要更改的代码阶段——例如,如果您从 .csv 文件中读取数据,则可以尝试使用 stringsAsFactors=FALSE 参数。如果您想更正“data”对象,则可以执行“data[data== 'NA'] <- NA”。 - rbatt

2

如@rbatt所提到的,你将字符NA值作为因子级别。你可以移除它们,并通过以下方法使整个数据集中的NA条目注册为实际的NA值:

df[] <- lapply(df, function(x) {
    is.na(levels(x)) <- levels(x) == "NA"
    x
})

其中df是你的数据集。现在进行测试:

is.na(df)

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