[英]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.