【问题标题】:R: is.na() does not pick up NA valueR: is.na() 不获取 NA 值
【发布时间】:2015-05-22 02:46:35
【问题描述】:

所以我有一个数据集,只需查看它,数据集中就有明显的 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 函数,我只会得到一个空数据集作为回报。

【问题讨论】:

  • 列中的值不是NA 而是"NA" 字符串。见levels( bmi.cig$MSI.subset.BMI)
  • 好的。如何将它们从“NA”字符串更改为 NA?我的目标只是使用 ld 函数并执行列表删除。

标签: r


【解决方案1】:

b/c 列是因子,水平是"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")),而不是 logicalclass(NA)

【讨论】:

  • 我明白了。对于整个数据集,如何将它们从“NA”更改为 NA?
  • 如果您想过滤掉 NA,您可以执行以下操作:msi[msi$MSI.subset.BMI != "NA" &amp; msi$MSI.subset.BMI != "NA",],这应该适用于您的数据框并为您提供所需的内容
  • 取决于您想要更改代码的哪个阶段 - 例如,如果您从 .csv 读取数据,您可以尝试使用 stringsAsFactors=FALSE 参数。如果你想更正data 对象,你可以做data[data=="NA"] &lt;- NA
【解决方案2】:

正如@rbatt 提到的,您将字符 NA 值作为因子级别。您可以删除它们并将 NA 条目注册为整个数据集的真实 NA

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

df 是您的数据集。现在测试

is.na(df)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多