我有一个数据框,其中包含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
答案 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
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
既然我已经完成了这一切,我想知道你是否尝试过运行线性模型。