繁体   English   中英

如何处理分类变量中的 NA 值?

[英]How to deal with NA values in a categorical variable?

我面临一个奇怪的问题,我希望有人能帮忙。 我在 R 中有一个具有 8 个类(级别)的事实变量,如下所示:

> levels(data_testing$land_cover)
[1] "COMMERCIAL"                   "GOVERNMENT AND INSTITUTIONAL" "NOT AVAILABLE"              
[4] "OPEN AREA"                    "PARKS AND RECREATIONAL"       "RESIDENTIAL"                
[7] "RESOURCE AND INDUSTRIAL"      NA 

如您所见,NA 是变量“land_cover.”的级别之一,级别的频率如下:

COMMERCIAL GOVERNMENT AND INSTITUTIONAL                NOT AVAILABLE
                         236                          150                          469
                   OPEN AREA       PARKS AND RECREATIONAL                  RESIDENTIAL
                         908                          108                         6034
     RESOURCE AND INDUSTRIAL                         <NA>
                        1584                         2505

所以它说有 2505 个 NA 值。 但是,当我计算这样一个变量的总缺失值时,它显示没有:

sum (is.na(data_testing$land_cover))
[1] 0

我的问题是,是否有人知道我如何重命名、重估这个NA 我尝试将NA替换或重命名为其他名称,但NA无法识别为级别。

我的最终目标是将所有NA值添加到“NOT AVAILABLE”类并摆脱NA类。 但是,显然,在替换或重估函数中, NA不能被识别为一个类。

我真的很感谢你的帮助。

干杯-

您的矢量levels有问题。 我不知道它是如何创建的(假设它是以编程方式完成的),但让我们编写一个类似的向量并说明为什么它与您的测试不匹配。

首先, factor只是一个integer向量,有两个不同: "levels"的属性,它是"levels"的字符串向量; 它被归类为"factor"

dput(factor(letters[1:3]))
# structure(1:3, .Label = c("a", "b", "c"), class = "factor")

让我们手动构建一个:

vec <- 1:3
attr(vec, "levels") <- c("A", "B", NA, "D")
vec
# [1] 1 2 3
# attr(,"levels")
# [1] "A" "B" NA  "D"

还不是一个因子,所以整数仍然显示 not- NA

class(vec) <- "factor"
vec
# [1] A    B    <NA>
# Levels: A B <NA> D

dput(vec)
# structure(c(1L, 2L, NA), .Label = c("A", "B", NA, "D"), class = "factor")

attributes(vec)
# $levels
# [1] "A" "B" NA  "D"
# $class
# [1] "factor"

所以我们没有对vec的整数做任何事情,但现在其中一个显示为NA 有趣的。

不幸的是,我们知道在factor类下面,数字仍然是 1、2 和 3,而不是NA ,所以我们不应该对此感到完全惊讶:

is.na(vec)
# [1] FALSE FALSE FALSE
as.integer(vec)
# [1] 1 2 3

但是,要找出哪个vec引用NA

as.character(vec)
# [1] "A" "B" NA 
is.na(as.character(vec))
# [1] FALSE FALSE  TRUE

并找出哪个级别NA

is.na(levels(vec))
# [1] FALSE FALSE  TRUE FALSE

如果要替换NA级别,可以尝试以下操作:

lvls <- levels(vec)
lvls[is.na(lvls)] <- "NOT AVAILABLE"
levels(vec) <- lvls

vec
# [1] A             B             NOT AVAILABLE
# Levels: A B NOT AVAILABLE D

(我从来没有真正喜欢如何在没有引号的情况下显示因子,因为上面的Levels:可能含糊不清。)


顺便说一句,许多辅助函数试图阻止您这样做。 例如:

vec <- 1:3
attr(vec, "levels") <- LETTERS[1:4]
class(vec) <- "factor"
dput(vec)
# structure(1:3, .Label = c("A", "B", "C", "D"), class = "factor")
attr(vec, "levels") <- c("A", "B", NA, "D")
dput(vec)
# structure(1:3, .Label = c("A", "B", NA, "D"), class = "factor")

注意我们如何有 (i) 仍然是整数 1 到 3; (ii) NA水平。 但是,如果我们正式这样做,

levels(vec) <- c("A", "B", NA, "D")
dput(vec)
# structure(c(1L, 2L, NA), .Label = c("A", "B", "D"), class = "factor")

我们丢失了一个整数! 我们失去了NA级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM