更改级别时如何保留NA [英] How can I keep NA when I change levels

查看:94
本文介绍了更改级别时如何保留NA的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我建立了一个包含NA的因子的向量.

I build a vector of factors containing NA.

my_vec <- factor(c(NA,"a","b"),exclude=NULL)
levels(my_vec)
# [1] "a" "b" NA 

我更改了其中一个级别.

I change one of those levels.

levels(my_vec)[levels(my_vec) == "b"] <- "c"

NA不见了.

levels(my_vec)
# [1] "a" "c"

我如何保留它?

编辑

@rawr提供了一个很好的解决方案,该解决方案在大多数情况下都可以使用,它适用于我之前的特定示例,但不适用于我将在下面显示的示例 @ Hack-R有一个使用addNA的实用选项,我可以使其兼容,但我宁愿使用一个完全通用的解决方案

@rawr gave a nice solution that can work most of the time, it works for my previous specific example, but not for the one I'll show below @Hack-R had a pragmatic option using addNA, I could make it work with that but I'd rather a fully general solution

看到这个普遍的问题

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的解决方案:

@rawr's solution:

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的解决方案:

@Hack-R's solution:

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

我想要levels(my_vec) == c("a",NA,"c")

推荐答案

您必须引用 NA ,否则R会将其视为空值而不是因子水平.因子级别默认情况下按字母顺序排序,但显然并不总是如此,因此您可以通过将新的列表顺序传递给levels()

You have to quote NA, otherwise R treats it as a null value rather than a factor level. Factor levels sort alphabetically by default, but obviously that's not always useful, so you can specify a different order by passing a new list order to levels()

require(plyr)
my_vec <- factor(c("NA","a","b1","b2"))
vec2 <- revalue(my_vec,c("b1"="c","b2"="c"))

#now reorder levels

my_vec2 <- factor(vec2, levels(vec2)[c(1,3,2)])

Levels: a NA c

这篇关于更改级别时如何保留NA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆