我试图将变量的值更改为NA值,如果它们不在向量中:
sample <- factor(c('01', '014', '1', '14', '24'))
df <- data.frame(var1 = 1:6, var2 = factor(c('01', '24', 'none', '1', 'unknown', '24')))
df$var2 <- ifelse(df$var2 %in% sample, df$var2, NA)
出于某种原因,R不会保留原始的因子变量值,而是将它们转换为数值序列:
> sample <- factor(c('01', '014', '1', '14', '24'))
> df <- data.frame(var1 = 1:6,
var2 = factor(c('01', '24', 'none', '1', 'unknown', '24')))
> class(df$var2)
[1] "factor"
> df
var1 var2
1 1 01
2 2 24
3 3 none
4 4 1
5 5 unknown
6 6 24
> df$var2 <- ifelse(df$var2 %in% sample, df$var2, NA)
> class(df$var2)
[1] "integer"
> df
var1 var2
1 1 1
2 2 3
3 3 NA
4 4 2
5 5 NA
6 6 3
为什么会发生这种情况,我应该怎么做才能正确地实现我的目标?
(我需要使用因子而不是整数,以免混淆“01”和“1”,并且我的原始数据集很大,因此使用因子而不是字符应该可以节省一些内存。)
dplyr::if_else
。 - tchakravartyifelse()
函数周围简单地添加as.factor()
吗? 像这样:df$var2 <- as.factor(ifelse(df$var2 %in% sample, df$var2, NA))
- Pierre Chevalliercharacter
存储得和factor
一样高效。我避免使用factor
,除非绝对必要。(2)factor
的_levels_被存储为integer
,所以不会有意外。(3)请阅读help("ifelse")
中的_Warning_部分:_结果的模式可能取决于test的值,并且结果的类属性取自test,可能不适用于从yes和no中选择的值。_另请参考那里的建议以避免意外。 - Uwe