【问题标题】:R dropping NA's in logical column levelsR在逻辑列级别中删除NA
【发布时间】:2014-11-06 09:09:12
【问题描述】:

我有一个数据框,其中包含带有NAs 和"" 的损坏行。我无法从要导入 R 的 .csv 文件中删除它,因为 Excel 无法处理(打开).csv 文档的大小。

我在第一次使用read.csv() 时进行检查,如下所示以删除带有NA 的行:

  if ( any( is.na(unique(data$A)) )   ){
  print("WARNING: data has a corrupt row in it!")  
  data <- data[ !is.na(data$A) , ]  
  }

但是,就像factor 一样,A 列将NA 记住为一个级别:

> summary(data$A)
   Mode   FALSE    TRUE    NA's 
logical  185692   36978       0 

当我尝试拟合线性模型时,这显然会导致问题。我怎样才能在这里摆脱 NA 作为逻辑级别?

我试过了,但似乎没有用:

A <- as.logical(droplevels(factor(data_combine$A)))
summary(A)
   Mode   FALSE    TRUE    NA's 
logical  185692   36978       0 
unique(A)
[1] FALSE  TRUE

【问题讨论】:

  • 嗯,如果我运行x &lt;- factor(c(LETTERS[1:3], NA),即使在运行levels(x) &lt;- c(levels(x), NA) 之后,x 的因子水平也不包括 NA
  • summary(data$A) 似乎表明data$A 实际上是logical 而不是factor。检查summary(c(T,F))summary(factor(c(T,F)))
  • @beginneR - 你可以用factor(NA, exclude=NULL)添加NA作为一个级别
  • 看起来 NA 总是出现在逻辑向量摘要中。试试summary(c(logical(4), !logical(2)))
  • @Richard Scriven,是的,我刚才确实注意到了这一点。所以这里可能没有level相关的问题(由NA介绍)。

标签: r logical-operators na


【解决方案1】:

首先,您的data$A 不是一个因素,而是一个合乎逻辑的因素。 summary 打印方法对于因素和逻辑是不同的。逻辑使用summary.default,而因子分派到summary.factor。另外,它会在结果中告诉您该变量是逻辑变量。

fac <- factor(c(NA, letters[1:4]))
log <- c(NA, logical(4), !logical(2))
summary(fac)
#   a    b    c    d NA's 
#   1    1    1    1    1 
summary(log)
#    Mode   FALSE    TRUE    NA's 
# logical       4       2       1 

请参阅?summary 了解差异。

其次,你的电话

A <- as.logical(droplevels(factor(data_combine$A)))
summary(A)

也调用了summary.default,因为你用as.logical包裹了droplevels(为什么?)。所以根本不要改变data_combine$A,试试吧

summary(data_combine$A)

看看情况如何。如需更多信息,请提供您的数据样本。

【讨论】:

  • 谢谢,我知道该列是合乎逻辑的。我缺少的信息是summary(logical) 总是打印NA's。所以这是一条红鲱鱼。
  • @Zhubarb - 我之前还发布了另一个答案(当前已删除),该答案显示了如何向摘要打印方法添加选项。如果你愿意,我可以取消删除它
  • 谢谢,如果不麻烦的话,将它附加到您现有的文件中会很有用。
  • @Zhubarb - 我取消删除了我的另一个答案,因为附加到这个答案有点长
【解决方案2】:

正如我在其他答案中提到的,这些实际上不是因素水平。既然您询问如何删除 summary 上的 NA 打印,我将取消删除此答案。

NA 打印被硬编码到逻辑向量的摘要中。这是来自summary.default的相关代码。

# value <- if (is.logical(object)) 
#     c(Mode = "logical", {
#         tb <- table(object, exclude = NULL)
#         if (!is.null(n <- dimnames(tb)[[1L]]) && any(iN <- is.na(n))) 
#             dimnames(tb)[[1L]][iN] <- "NA's"
#         tb
#     })

table 中的 exclude = NULL 是问题所在。如果我们用逻辑向量log 查看table 中的exclude 参数,我们可以看到当它是NULL 时,NA 总是会打印出来。

log <- c(NA, logical(4), NA, !logical(2), NA)
table(log, exclude = NULL)                  ## with NA values
# log
# FALSE  TRUE  <NA> 
#     4     2     3 
table(log[!is.na(log)], exclude = NULL)     ## NA values removed
# 
# FALSE  TRUE  <NA> 
#     4     2     0 

为了让您的摘要按您想要的方式打印,我们可以在原始源代码的基础上编写一个summary 方法。

summary.logvec <- function(object, exclude = NA) {
    stopifnot(is.logical(object))
    value <- c(Mode = "logical", {
        tb <- table(object, exclude = exclude)
            if(is.null(exclude)) {
                if (!is.null(n <- dimnames(tb)[[1L]]) && any(iN <- is.na(n)))
                    dimnames(tb)[[1L]][iN] <- "NA's"
            }
            tb
        })
    class(value) <- c("summaryDefault", "table")
    print.summary.logvec <- function(x) {
        UseMethod("print.summaryDefault")
    } 
    value
}

然后是结果。由于我们在 print 方法中设置了exclude = NA,因此除非我们将其设置为 NULL,否则 NA 将不会打印

summary(log)  ## original vector
#    Mode   FALSE    TRUE    NA's 
# logical       4       2       3 
class(log) <- "logvec"
summary(log, exclude = NULL)  ## prints NA when exclude = NULL
#    Mode   FALSE    TRUE    NA's 
# logical       4       2       3 
summary(log)  ## NA's don't print 
#    Mode   FALSE    TRUE 
# logical       4       2 

现在我已经完成了所有这些,我想知道您是否尝试过运行您的线性模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多