使用apply()函数更新R中数据帧的多列的因子级别

时间:2014-04-10 05:26:42

标签: r dataframe apply

直截了当地提问。假设我有以下数据框:

> head(temp)
  Gender Age Agegroup
2   Male  63      61+
3   Male  60    50-60
4   Male  55    50-60
5   Male  36    30-39
7   Male  39    30-39
8   Male  63      61+

调用摘要函数:

> summary(temp)
    Gender            Age         Agegroup     
 Male  :864692   Min.   :25.00   25-29:0  
 Female:     0   1st Qu.:35.00   30-39:205237  
                 Median :45.00   40-49:235622  
                 Mean   :44.48   50-60:250977  
                 3rd Qu.:54.00   61+  : 68807  
                 Max.   :64.00   

正如您所看到的,对女性因素和25-29因子水平的观察结果为零。结果,我不需要那些水平。我使用以下代码删除它们:

temp$Gender<-factor(temp$Gender)
temp$Agegroup<-factor(temp$Agegroup)

我的问题是:如何使用apply函数执行我用来删除级别的代码?看起来像:

# Pseudo code just to illustrate my purpose
temp[,c(1,3)]<-apply(temp[,c(1,3)],FUN=factor)

如果我需要更新数据框的大量列的级别,它将非常方便。谢谢。如果您需要更多说明,请与我们联系。

1 个答案:

答案 0 :(得分:4)

您正在寻找droplevels

以下是与您类似的一些示例数据:

set.seed(1)
mydf <- data.frame(A = factor(rep("M", 5), levels = c("M", "F")),
                   B = sample(20:50, 5, TRUE))
mydf$C <- cut(mydf$B, seq(0, 80, 10))
mydf
#   A  B       C
# 1 M 28 (20,30]
# 2 M 31 (30,40]
# 3 M 37 (30,40]
# 4 M 48 (40,50]
# 5 M 26 (20,30]
summary(mydf)
#  A           B            C    
#  M:5   Min.   :26   (20,30]:2  
#  F:0   1st Qu.:28   (30,40]:2  
#        Median :31   (40,50]:1  
#        Mean   :34   (0,10] :0  
#        3rd Qu.:37   (10,20]:0  
#        Max.   :48   (50,60]:0  
#                     (Other):0

现在,让我们使用droplevels,看看会发生什么:

mydf2 <- droplevels(mydf)
summary(mydf2)
#  A           B            C    
#  M:5   Min.   :26   (20,30]:2  
#        1st Qu.:28   (30,40]:2  
#        Median :31   (40,50]:1  
#        Mean   :34              
#        3rd Qu.:37              
#        Max.   :48         

如果您真的想使用*apply方法,也许您可​​以使用lapply,如下所示:

mydf3 <- mydf                    ## Create a copy of your original just in case
mydf3[] <- lapply(mydf3, factor)
summary(mydf3)
#  A      B           C    
#  M:5   26:1   (20,30]:2  
#        28:1   (30,40]:2  
#        31:1   (40,50]:1  
#        37:1              
#        48:1