3

假设您有一个data.frame具有多个具有不同级别数的因子:

V1<-factor(sample(c(1:5,9),100,TRUE))
V2<-factor(sample(c(1:5,9),100,TRUE))
V3<-factor(sample(c(1:5),100,TRUE))
V4<-factor(sample(c(1:5),100,TRUE))
dat<-data.frame(V1,V2,V3,V4)

目标是估计两个因子的水平频率差异。但是,由于级别数不同,基于 V1/V2 和 V3/V4 的两个表中的数组是不一致的,例如:

table(dat$V1)-table(dat$V3)
Error in table(dat$V1) - table(dat$V3) : non-conformable arrays

目标是使 V3 和 V4 一致,以使操作有效。一种选择是:

dat$V3<-factor(dat$V3,levels=c('1','2','3','4','5','9')

但是,它需要为每个变量设置因子水平,这对于许多变量 V5、...、Vn 来说是不切实际的。我想

dat[,3:4]<-apply(dat[,3:4],2,factor,levels=c('1','2','3','4','5','9'))

可能在更一般的情况下工作,但is.factor(dat$V3)那时是 FALSE。

编辑:此功能可能会完成 SimonO101 的答案:

correct_factors<-function(df_object,range){

  if(is.data.frame(df_object)==FALSE){stop('Requires data.frame object')}
  levs <- unique( unlist( lapply( df_object[,range[1]:range[2]] , levels ) ) )
  df_object[,range[1]:range[2]] <- 
     data.frame( lapply( df_object[,range[1]:range[2]] , factor , levels = levs ) )
  return(df_object)      

}
4

1 回答 1

4

试试这个来协调水平......

#  Get vector of all levels that appear in the data.frame
levs <- unique( unlist( lapply( dat , levels ) ) )

#  Set these as the levels for each column    
dat2 <- data.frame( lapply( dat , factor , levels = levs ) )

table(dat2$V1)-table(dat2$V3)
#  1   2   3   4   5   9 
#-15  -5   4   7  -5  14 
于 2013-11-13T12:36:52.240 回答