为什么R在将NA值添加到具有因子的数据框时更改变量类型?

tom*_*mka 9 r dataframe rbind na r-factor

当使用带有值rbind的两个时,我对R强制变量类型的方式有疑问.我举例说明:data.framesNA

x<-factor(sample(1:3,10,T))
y<-rnorm(10)
dat<-data.frame(x,y)
NAs<-data.frame(matrix(NA,ncol=ncol(dat),nrow=nrow(dat)))
colnames(NAs)<-colnames(dat)
Run Code Online (Sandbox Code Playgroud)

现在的目标是追加dat,并NAs同时保持变量类型factornumericxy.当我给:

dat_forward<-rbind(dat,NAs)
is.factor(dat_forward$x)
Run Code Online (Sandbox Code Playgroud)

这很好用.但是后向使用rbind失败:

dat_backward<-rbind(NAs,dat)
is.factor(dat_backward$x)
is.character(dat_backward$x)
Run Code Online (Sandbox Code Playgroud)

现在x被强迫角色等级.我很困惑 - 即使我使用其他绑定顺序,也不能保留因子类型?为实现目标,我的代码会有什么直接的变化?

Jos*_*ien 9

这是一个让列类正确的简单方法:

x <- rbind(dat[1,], NAs, dat)[-1,]
str(x)
#  $ x: Factor w/ 3 levels "1","2","3": NA NA NA NA NA NA NA NA NA NA ...
#  $ y: num  NA NA NA NA NA NA NA NA NA NA ...
Run Code Online (Sandbox Code Playgroud)

更一般地,如果你真的需要这个时候,你可以创建一个rbind样函数,它指示data.frame到其列班你想迫使所有其他栏目的一个额外的参数:

myrbind <- function(x, ..., template=x) {
    do.call(rbind, c(list(template[1,]), list(x), list(...)))[-1,]
}

str(myrbind(NAs, dat,  template=dat))
# 'data.frame': 20 obs. of  2 variables:
#  $ x: Factor w/ 3 levels "1","2","3": NA NA NA NA NA NA NA NA NA NA ...
#  $ y: num  NA NA NA NA NA NA NA NA NA NA ...

## If no 'template' argument is supplied, myrbind acts just like rbind    
str(myrbind(dat, NAs))
# 'data.frame': 20 obs. of  2 variables:
#  $ x: Factor w/ 3 levels "1","2","3": 3 3 3 3 2 3 1 1 3 2 ...
#  $ y: num  0.303 1.77 -1.38 1.731 0.033 ...
Run Code Online (Sandbox Code Playgroud)