在因子水平上混淆并与dplyr变异

时间:2018-09-06 22:59:19

标签: r dplyr

我正在尝试使用ifelse替换数据集中类别列中的NA值,但是当我尝试重新编码其他值时。我确定因子水平正在发生变化,我只是不知道该如何解决。请注意,应用ifelse后,mpg的差异会如何变化,这只会影响具有NA的记录?

mtcars2 = mtcars

mtcars2$mpg = as.factor(mtcars2$mpg)
mtcars2$mpg[1]=NA
mtcars2$mpg[2]=NA

hmm = mtcars2 %>% dplyr::mutate_if(is.factor, function(x) ifelse(is.na(x)==TRUE, "NO VALUE", x)

hmm
###vs
mtcars2

3 个答案:

答案 0 :(得分:1)

display: none;的{​​{1}}和yes参数并不是向量,而是只要测试为真,原子就会重复出现。这就是为什么无论使用no还是ifelse都无法“重建”该因子,如@akrun的评论一样。

您可以使用dplyr中的base函数来实现所需的功能,但是首先必须将变量转换为coalesce,否则将失败,因为您是添加不属于dplyr级别的值:

character

然后根据需要将其转换为factor

答案 1 :(得分:1)

因此,由于您提到的列是分类的,因此我使用了HairEyeColor数据集,该数据集具有包含分类和定量数据的列。

我不确定您正在使用的列是因子还是字符。 您可以使用class()

进行检查

如果它是字符,则应该起作用:

data<-as_tibble(HairEyeColor)

data$Eye[2]<-NA
data$Eye[3]<-NA

hmm <- data %>% mutate_if(is.character, function(x) ifelse(is.na(x)==TRUE, "NO VALUE", x))

如果因子,

data<-as_tibble(HairEyeColor)

data$Eye<-as.factor(data$Eye)
class(data$Eye)
data$Eye[2]<-NA
data$Eye[3]<-NA

hmm <- data %>% mutate_if(is.factor, function(x) ifelse(is.na(x)==TRUE, "NO VALUE", x))

希望有帮助!

答案 2 :(得分:1)

其他人已经指出了一些问题:

1)ifelse重复原子值,这导致“分解”:

x <- factor( 1:3 )
# [1] 1 2 3               # Factor
# Levels: 1 2 3

ifelse( is.na(x), x, x )  # Effectively "do nothing"
# [1] 1 2 3               # No longer a factor

2)您在数字值上定义了一个因数,将其强制为字符。如果您以后假设它们仍然是数字,则这可能是不希望有的并导致意外的行为:

levels(factor(1:3))       # Factor defined over numeric values
# [1] "1" "2" "3"         #  but has character levels

话虽如此,如果您的目标是用另一个值替换因子中的NA,那么forcats::fct_explicit_na()是您要查找的函数:

mhm <- mtcars2 %>% mutate_if( is.factor, fct_explicit_na, "NO VALUE" )
#         mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1  NO VALUE   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# 2  NO VALUE   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# 3      22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# ...

mhm$mpg
# [1] NO VALUE NO VALUE 22.8     21.4     18.7    ...
# 26 Levels: 10.4 13.3 14.3 14.7 15 15.2 ... NO VALUE