【发布时间】:2019-02-14 16:06:11
【问题描述】:
在尝试用数字 9 替换多个因子变量的 NA 时,我注意到 apply() 的一种特殊行为。我已经定义了这些变量的级别和标签。当我对每个变量单独使用 ifelse() 时(例如 ifelse(is.na(x),9,x),它会将变量强制转换为整数,这是可以理解的。但是,当我创建一个函数来执行完全相同的操作时在多列上使用 apply(),它将所有变量强制转换为字符。再添加一个步骤将它们转换回函数中的因子无济于事。我错过了什么或者 apply() 函数有什么奇怪的地方吗?谢谢!
a<-c(1,2,3,NA,2)
b<-c(2,1,2,2,NA)
a<-factor(a,levels=c(1,2,3),labels=c("First","Second","Third"))
b<-factor(b,levels=c(1,2,3), labels=c("AA","BB","CC"))
dat<-cbind(a,b)
replace.na<-function(x){
x<-as.factor(ifelse(is.na(x),9,x))
}
a<-ifelse(is.na(a),9,a)
str(a)
dat<-apply(dat,2,replace.na)
str(dat)
我希望 apply() 会产生相同类型的变量,或者至少在函数中使用 as.factor() 会将变量强制转换为因子。
【问题讨论】:
-
R
apply函数通常返回一个矩阵,R 矩阵不能包含因子。所以这不是一种特殊的行为。这是一个设计特点。 -
谢谢!我不知道。我会记住这一点。那么你会推荐 apply() 系列中的哪个函数呢?
-
很难确切知道。
dat对象也没有任何因子组件,因为您使用了cbind。