R中的缺失是如何表示的?
How are missings represented in R?
事先
标题最明显的答案是缺失在 R 中用 NA
表示。虚拟数据:
x <- c("a", "NA", "<NA>", NA)
我们可以使用 x_paste0 <- paste0(x)
将 x
的所有元素转换为字符。这样做之后,第二个和第四个元素相同("NA"
),据我所知,这就是为什么无法将 x_paste0
反向转换为 x
.
的原因
addNA
但是使用 addNA
表明它不仅仅是 NA
本身代表缺失。在 x
中,只有最后一个元素缺失。让我们变换向量:
x_new <- addNA(x)
x_new
[1] a NA <NA> <NA>
Levels: <NA> a NA <NA>
有趣的是,第四个元素,即缺失显示为 <NA>
而不是 NA
。此外,现在第四个元素看起来与第三个元素相同。我们被告知没有遗漏,因为当我们尝试 any(is.na(x_new))
时,我们得到 FALSE
。在这一点上,我会认为关于缺少什么元素(第三个或第四个)的信息只是像 x_paste0
中那样丢失了。但事实并非如此,因为我们实际上可以反向转换 x_new
。参见:
as.character(x_new)
[1] "a" "NA" "<NA>" NA
as.character
怎么知道第三个元素是"<NA>"
而第四个是实际缺失的,即NA
?
这可能是 base:::print.factor()
方法中的不洁之处。
x <- c("a", "NA", "<NA>", NA)
addNA(x)
# [1] a NA <NA> <NA>
# Levels: <NA> a NA <NA>
但是:
levels(addNA(x))
# [1] "<NA>" "a" "NA" NA
所以,没有重复的关卡。
通常您在读取数据(csv 或其他来源)时会尽量避免这种情况。在您的矢量样本数据上使用 read.table 的一些愚蠢的演示。
x <- c("a", "NA", "<NA>", NA)
x <- read.table(text = x, na.strings = c("NA", "<NA>", ""), stringsAsFactors = F)$V1
x
[1] "a" NA NA NA
但如果你想事后修复它
x <- c("a", "NA", "<NA>", NA)
na_strings <- c("NA", "<NA>", "")
unlist(lapply(x, function(v) { ifelse(v %in% na_strings, NA, v) }))
[1] "a" NA NA NA
关于因子和 addNA 的一些注释
# to not be confused with character values pretending to be missing values but are not
x <- c("a", "b", "c", NA)
x_1 <- addNA(x)
x_1
# do not get confused on how the displayed output is
# [1] a b c <NA>
# Levels: a b c <NA>
str(x_1)
# Factor w/ 4 levels "a","b","c",NA: 1 2 3 4
is.na(x_1) # as your actual values are 1, 2, 3, 4
# [1] FALSE FALSE FALSE FALSE
is.na(levels(x_1))
# [1] FALSE FALSE FALSE TRUE
# but nothing is lost
x_2 <- as.character(x_1)
str(x_2)
# chr [1:4] "a" "b" "c" NA
is.na(x_2)
# [1] FALSE FALSE FALSE TRUE
事先
标题最明显的答案是缺失在 R 中用 NA
表示。虚拟数据:
x <- c("a", "NA", "<NA>", NA)
我们可以使用 x_paste0 <- paste0(x)
将 x
的所有元素转换为字符。这样做之后,第二个和第四个元素相同("NA"
),据我所知,这就是为什么无法将 x_paste0
反向转换为 x
.
addNA
但是使用 addNA
表明它不仅仅是 NA
本身代表缺失。在 x
中,只有最后一个元素缺失。让我们变换向量:
x_new <- addNA(x)
x_new
[1] a NA <NA> <NA>
Levels: <NA> a NA <NA>
有趣的是,第四个元素,即缺失显示为 <NA>
而不是 NA
。此外,现在第四个元素看起来与第三个元素相同。我们被告知没有遗漏,因为当我们尝试 any(is.na(x_new))
时,我们得到 FALSE
。在这一点上,我会认为关于缺少什么元素(第三个或第四个)的信息只是像 x_paste0
中那样丢失了。但事实并非如此,因为我们实际上可以反向转换 x_new
。参见:
as.character(x_new)
[1] "a" "NA" "<NA>" NA
as.character
怎么知道第三个元素是"<NA>"
而第四个是实际缺失的,即NA
?
这可能是 base:::print.factor()
方法中的不洁之处。
x <- c("a", "NA", "<NA>", NA)
addNA(x)
# [1] a NA <NA> <NA>
# Levels: <NA> a NA <NA>
但是:
levels(addNA(x))
# [1] "<NA>" "a" "NA" NA
所以,没有重复的关卡。
通常您在读取数据(csv 或其他来源)时会尽量避免这种情况。在您的矢量样本数据上使用 read.table 的一些愚蠢的演示。
x <- c("a", "NA", "<NA>", NA)
x <- read.table(text = x, na.strings = c("NA", "<NA>", ""), stringsAsFactors = F)$V1
x
[1] "a" NA NA NA
但如果你想事后修复它
x <- c("a", "NA", "<NA>", NA)
na_strings <- c("NA", "<NA>", "")
unlist(lapply(x, function(v) { ifelse(v %in% na_strings, NA, v) }))
[1] "a" NA NA NA
关于因子和 addNA 的一些注释
# to not be confused with character values pretending to be missing values but are not
x <- c("a", "b", "c", NA)
x_1 <- addNA(x)
x_1
# do not get confused on how the displayed output is
# [1] a b c <NA>
# Levels: a b c <NA>
str(x_1)
# Factor w/ 4 levels "a","b","c",NA: 1 2 3 4
is.na(x_1) # as your actual values are 1, 2, 3, 4
# [1] FALSE FALSE FALSE FALSE
is.na(levels(x_1))
# [1] FALSE FALSE FALSE TRUE
# but nothing is lost
x_2 <- as.character(x_1)
str(x_2)
# chr [1:4] "a" "b" "c" NA
is.na(x_2)
# [1] FALSE FALSE FALSE TRUE