我创建了一个包含NA值的因子向量。
我修改了其中一个级别。
NA消失了。
@rawr的解决方案:
@Hack-R的解决方案:
my_vec <- factor(c(NA,"a","b"),exclude=NULL)
levels(my_vec)
# [1] "a" "b" NA
我修改了其中一个级别。
levels(my_vec)[levels(my_vec) == "b"] <- "c"
NA消失了。
levels(my_vec)
# [1] "a" "c"
我该怎么保留它?
编辑
@rawr提供了一个不错的解决方案,可以大多数情况下工作,它适用于我的先前特定示例,但对于下面我将展示的示例则无效。 @Hack-R提供了一种实用的选项,使用addNA我可以使其正常工作,但我更喜欢一个完全通用的解决方案。
请参阅这个广义问题
my_vec <- factor(c(NA,"a","b1","b2"),levels = c("a",NA,"b1","b2"),exclude=NULL)
levels(my_vec)
[1] "a" NA "b1" "b2"
levels(my_vec)[levels(my_vec) %in% c("b1","b2")] <- "c"
levels(my_vec)
[1] "a" "c" # NA disppeared
@rawr的解决方案:
my_vec <- factor(c(NA,"a","b1","b2"),levels = c("a",NA,"b1","b2"),exclude=NULL)
levels(my_vec)
[1] "a" NA "b1" "b2"
attr(my_vec, 'levels')[levels(my_vec) %in% c("b1","b2")] <- "c"
levels(my_vec)
droplevels(my_vec)
[1] "a" NA "c" "c" # c is duplicated
@Hack-R的解决方案:
my_vec <- factor(c(NA,"a","b1","b2"),levels = c("a",NA,"b1","b2"),exclude=NULL)
levels(my_vec)
[1] "a" NA "b1" "b2"
levels(my_vec)[levels(my_vec) %in% c("b1","b2")] <- "c"
my_vec <- addNA(my_vec)
levels(my_vec)
[1] "a" "c" NA # NA is in the end
I want levels(my_vec) == c("a",NA,"c")
?levels
表明你的方法是首选,但是attr(my_vec, 'levels')[attr(my_vec, 'levels') == 'b'] <- 'c'
的效果也是符合预期的。 - rawrattr(my_vec, 'levels')[levels(my_vec) == "b"] <- 'c'
同样有效,这将解决我的问题,现在知道为什么会这样也是不错的 :) - moodymudskipperfunction (x, value) .Primitive("levels<-")
: 祝你好运 ;-) - Cathvec <- factor(c("a","b", NA), levels=paste(c("a","b", NA)))
。 - lmo