R:为什么“ifelse”将因子强制转换为整数?

时间:2016-11-10 08:58:39

标签: r

如果它们不在矢量中,我试图将变量的值更改为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”而我的原始数据集很大,所以使用因子而不是字符应该可以节省一些内存)

1 个答案:

答案 0 :(得分:2)

我认为实现目标的一种方法是改变因素的水平:

levels(df$var2)[!levels(df$var2) %in% sample] <- NA

通过更改级别,所有与这些级别不匹配的值将转换为因子NA,结果将为:

df
  var1 var2
1    1   01
2    2   24
3    3 <NA>
4    4    1
5    5 <NA>
6    6   24

> df$var2
[1] 01   24   <NA> 1    <NA> 24  
Levels: 01 1 24

未知和无值不再是因子水平。 或者,如果你想保留未知数,而不是你的价值观,你可以试试这个:

df$var2[!df$var2 %in% sample] <- NA

> df
  var1 var2
1    1   01
2    2   24
3    3 <NA>
4    4    1
5    5 <NA>
6    6   24


> df$var2
[1] 01   24   <NA> 1    <NA> 24  
Levels: 01 1 24 none unknown

ifelse更改数据类的原因是ifelse不维护类。请在此处阅读第二个答案:How to prevent ifelse() from turning Date objects into numeric objects

评论中提到的@tchakravarty的最后一种方法是使用来自dplyr的if_else!