R 指定不同类型的缺失值(NAs)
我想指定缺失值的类型。我有不同类型的缺失数据,我试图在R中将这些值编码为缺失,但我正在寻找一个解决方案,因为我仍然可以区分它们 假设我有一些像这样的数据R 指定不同类型的缺失值(NAs),r,base,missing-data,missing-features,R,Base,Missing Data,Missing Features,我想指定缺失值的类型。我有不同类型的缺失数据,我试图在R中将这些值编码为缺失,但我正在寻找一个解决方案,因为我仍然可以区分它们 假设我有一些像这样的数据 set.seed(667) df <- data.frame(a = sample(c("Don't know/Not sure","Unknown","Refused","Blue", "Red", "Green"), 20, rep=TRUE), b = sample(c(1, 2, 3, 77, 88, 99), 10, re
set.seed(667)
df <- data.frame(a = sample(c("Don't know/Not sure","Unknown","Refused","Blue", "Red", "Green"), 20, rep=TRUE), b = sample(c(1, 2, 3, 77, 88, 99), 10, rep=TRUE), f = round(rnorm(n=10, mean=.90, sd=.08), digits = 2), g = sample(c("C","M","Y","K"), 10, rep=TRUE) ); df
# a b f g
# 1 Unknown 2 0.78 M
# 2 Refused 2 0.87 M
# 3 Red 77 0.82 Y
# 4 Red 99 0.78 Y
# 5 Green 77 0.97 M
# 6 Green 3 0.99 K
# 7 Red 3 0.99 Y
# 8 Green 88 0.84 C
# 9 Unknown 99 1.08 M
# 10 Refused 99 0.81 C
# 11 Blue 2 0.78 M
# 12 Green 2 0.87 M
# 13 Blue 77 0.82 Y
# 14 Don't know/Not sure 99 0.78 Y
# 15 Unknown 77 0.97 M
# 16 Refused 3 0.99 K
# 17 Blue 3 0.99 Y
# 18 Green 88 0.84 C
# 19 Refused 99 1.08 M
# 20 Red 99 0.81 C
及
我现在将三个因素级别“不知道/不确定”、“未知”、“拒绝”重新编码到
现在,缺失的类别被重新编码为NA,但它们都集中在一起。是否有一种方法可以将丢失的内容重新编码,但保留原始值?我希望R将
“不知道/不确定”、“未知”、“拒绝”
和77、88、99
作为缺失线程,但我希望仍然能够在变量中保留信息 要保留原始值,可以创建新列,在其中对NA信息进行编码,例如:
df <- transform(df,b.na = ifelse(b %in% c('77','88','99'),NA,b))
df <- transform(df,a.na = ifelse(a %in%
c("Don't know/Not sure","Unknown","Refused"),NA,a))
另一个不创建新列的选项是使用类似于这样的,exclude
选项将非期望值设置为NULL(与缺少的值不同)
您可以定义一些全局常量(即使不推荐)来对“缺少的值”进行分组,并在程序的其余部分使用它们。大概是这样的:
B_MISSING <- c('77','88','99')
A_MISSING <- c("Don't know/Not sure","Unknown","Refused")
B_MISSING据我所知,base R没有内置的方法来处理不同的NA
类型。(编辑器:它有:NA_整数
,NA_实数
,NA_复数
,和NA_字符
。请参见?base::NA
)
一种选择是使用这样做的包,例如“”。这是一点额外的工作,但它似乎能满足你的需要
下面是一个例子:
首先,你的数据。我已经复制了一份,因为我们将对数据集进行一些非常重要的更改,有备份总是很好的
set.seed(667)
df <- data.frame(a = sample(c("Don't know/Not sure", "Unknown",
"Refused", "Blue", "Red", "Green"),
20, replace = TRUE),
b = sample(c(1, 2, 3, 77, 88, 99), 10,
replace = TRUE),
f = round(rnorm(n = 10, mean = .90, sd = .08),
digits = 2),
g = sample(c("C", "M", "Y", "K"), 10,
replace = TRUE))
df2 <- df
现在,将变量“a”和“b”转换为“memisc”中的item
s:
但是,我也建议您阅读@Maxim.K中关于缺失值的真正构成要素。如果您愿意坚持使用数值,那么NA
、Inf
、-Inf
和NaN
可以用于不同的缺失值。然后可以使用is.finite
来区分它们和正常值:
x <- c(NA, Inf, -Inf, NaN, 1)
is.finite(x)
## [1] FALSE FALSE FALSE FALSE TRUE
x在名为isNA
的df
中添加另一列如何,如果缺少值,该列将保持为真?或者isNA
列可以直接容纳NA
和0
。这取决于代码的其余部分。这将正常工作,但这更多是一种变通方法,而不是一种与我的代码的其余部分无缝工作的解决方案——正如您所指出的。您愿意在一个例子中演示它吗?很难预测它对代码其余部分的影响。可能您可以编写自己的my.table
,它使用my.is.na
返回TRUE
,用于“不知道/不确定”、“未知”、“拒绝”看起来您向我们提供了汇总数据。您是否将数据的格式设置为此步骤之前的一个步骤?“如果是这样的话,那只是一个考虑因素的问题。”布兰登贝特森,谢谢你的提问(和回答)。我提供的虚拟数据非常接近真实数据的外观。正如我在@Maxim.K中提到的,我本可以更精确地描述变量a
,但除此之外,我在问题中提供的数据非常接近我的真实数据。感谢您回答我的问题。我不知道排除
选项。这是一个有趣的解决方案。我仍然有点惊讶,R只有一类缺失值。@R有一类缺失值基本上是一个逻辑值,但也可以有不同的类型:NA\u integer\uu、NA\u real\uu、NA\u complex\uu和NA\u character\uu
。您可以看到我对“全局”解决方案的编辑。严格来说,这些不是(全部)遗漏。“不知道”并不是一个遗漏,它是一个有效的答案类别,在许多情况下都应该如此对待。“拒绝”也包含信息,而“未知”可能是真正的缺失。我只想用这三个子类别创建一个额外的专栏,并在需要时引用它们,同时使用常规NA来表示没有区别的统计技术。@Maxim.K,你的评论让我意识到我的问题本来可以更精确一些。在我的示例中,变量a
应该更像c(“未知”、“拒绝”、1、1、2、2、1、2、“未知”、“拒绝”、3、2、3、“不知道/不确定”、“未知”、“拒绝”、“3、2”、“拒绝”、1)
,我感兴趣的是以一种我可以总结的方式存储a
,但是在不失去“不知道/不确定”、“未知”、“拒绝”之间的区别的情况下。这有意义吗?@agstudy,关于全局常数,这是否是我的.Rprofile的一部分?+1非常详细的答案!我喜欢include.missings
:)时行名中的“*”)感谢您的详细回答,@agstudy也指出了这一点。+1非常详细,很好。R确实有办法处理不同的NA类型,但我不知道你是否能利用它。它必须能够做类(c(1,2,NA))
这是的“数字”
和类(c(“a”,“b”,NA))
这是的“字符”
?还有哪些包允许您同时使用不同类型的缺失?我有一个包含许多变量的数据集,一些是数字,一些是日期,我想对三种不同类型的缺失进行编码:错误、未知和由于数据重塑而生成的缺失。
is.na(df) <- df=="77"|df=="88"|df=="99"
table(df$a, df$g, useNA = "always")
# C K M Y <NA>
# Blue 0 0 1 2 0
# Green 2 1 2 0 0
# Red 1 0 0 3 0
# <NA> 1 1 5 1 0
table(df$b,df$g, useNA = "always")
# C K M Y <NA>
# 2 0 0 4 0 0
# 3 0 2 0 2 0
# <NA> 4 0 4 4 0
df <- transform(df,b.na = ifelse(b %in% c('77','88','99'),NA,b))
df <- transform(df,a.na = ifelse(a %in%
c("Don't know/Not sure","Unknown","Refused"),NA,a))
table(df$b.na , df$g)
C K M Y
2 0 0 4 0
3 0 2 0 2
table(df$a,df$g,
exclude=c('77','88','99',"Don't know/Not sure","Unknown","Refused"))
C K M Y
Blue 0 0 1 2
Green 2 1 2 0
Red 1 0 0 3
B_MISSING <- c('77','88','99')
A_MISSING <- c("Don't know/Not sure","Unknown","Refused")
set.seed(667)
df <- data.frame(a = sample(c("Don't know/Not sure", "Unknown",
"Refused", "Blue", "Red", "Green"),
20, replace = TRUE),
b = sample(c(1, 2, 3, 77, 88, 99), 10,
replace = TRUE),
f = round(rnorm(n = 10, mean = .90, sd = .08),
digits = 2),
g = sample(c("C", "M", "Y", "K"), 10,
replace = TRUE))
df2 <- df
df2$a <- factor(df2$a,
levels = c("Blue", "Red", "Green",
"Don't know/Not sure",
"Refused", "Unknown"),
labels = c(1, 2, 3, 77, 88, 99))
library(memisc)
df2$a <- as.item(as.character(df2$a),
labels = structure(c(1, 2, 3, 77, 88, 99),
names = c("Blue", "Red", "Green",
"Don't know/Not sure",
"Refused", "Unknown")),
missing.values = c(77, 88, 99))
df2$b <- as.item(df2$b,
labels = c(1, 2, 3, 77, 88, 99),
missing.values = c(77, 88, 99))
as.factor(df2$a)
# [1] <NA> <NA> Red Red Green Green Red Green <NA> <NA> Blue
# [12] Green Blue <NA> <NA> <NA> Blue Green <NA> Red
# Levels: Blue Red Green
as.factor(include.missings(df2$a))
# [1] *Unknown *Refused Red
# [4] Red Green Green
# [7] Red Green *Unknown
# [10] *Refused Blue Green
# [13] Blue *Don't know/Not sure *Unknown
# [16] *Refused Blue Green
# [19] *Refused Red
# Levels: Blue Red Green *Don't know/Not sure *Refused *Unknown
table(as.factor(include.missings(df2$a)), df2$g)
#
# C K M Y
# Blue 0 0 1 2
# Red 1 0 0 3
# Green 2 1 2 0
# *Don't know/Not sure 0 0 0 1
# *Refused 1 1 2 0
# *Unknown 0 0 3 0
table(as.factor(df2$a), df2$g)
#
# C K M Y
# Blue 0 0 1 2
# Red 1 0 0 3
# Green 2 1 2 0
table(as.factor(df2$a), df2$g, useNA="always")
#
# C K M Y <NA>
# Blue 0 0 1 2 0
# Red 1 0 0 3 0
# Green 2 1 2 0 0
# <NA> 1 1 5 1 0
table(as.factor(include.missings(df2$b)), df2$g)
#
# C K M Y
# 1 0 0 0 0
# 2 0 0 4 0
# 3 0 2 0 2
# *77 0 0 2 2
# *88 2 0 0 0
# *99 2 0 2 2
table(as.factor(df2$b), df2$g, useNA="always")
#
# C K M Y <NA>
# 1 0 0 0 0 0
# 2 0 0 4 0 0
# 3 0 2 0 2 0
# <NA> 4 0 4 4 0
> codebook(df2$a)
========================================================================
df2$a
------------------------------------------------------------------------
Storage mode: character
Measurement: nominal
Missing values: 77, 88, 99
Values and labels N Percent
1 'Blue' 3 25.0 15.0
2 'Red' 4 33.3 20.0
3 'Green' 5 41.7 25.0
77 M 'Don't know/Not sure' 1 5.0
88 M 'Refused' 4 20.0
99 M 'Unknown' 3 15.0
x <- c(NA, Inf, -Inf, NaN, 1)
is.finite(x)
## [1] FALSE FALSE FALSE FALSE TRUE