【问题标题】:Using apply() function to update the factor levels of multiple columns of a data frame in R使用apply()函数更新R中数据框多列的因子水平
【发布时间】:2014-04-10 05:26:41
【问题描述】:

直奔问题。假设我有以下数据框:

> 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)

如果我需要更新数据框的许多列的级别,它会很方便。谢谢。如果您需要更多说明,请告诉我。

【问题讨论】:

    标签: r dataframe apply


    【解决方案1】:

    您正在寻找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                   
    

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多