我正在尝试使用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
答案 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