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