R在逻辑列级别中丢弃NA

时间:2014-11-06 09:09:13

标签: r logical-operators na

我有一个数据框,其中包含NA""的损坏行。我无法从导入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

2 个答案:

答案 0 :(得分: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,因为你用droplevels包裹了as.logical(为什么?)。因此,根本不要更改data_combine$A,只需尝试

summary(data_combine$A)

看看情况如何。有关详细信息,请提供您的数据样本。

答案 1 :(得分:0)

正如我在其他答案中所提到的,那些实际上不是因子水平。自从您询问如何删除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
#     })

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

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 

既然我已经完成了这一切,我想知道你是否尝试过运行线性模型。