【问题标题】:Ranking rows for each subgroup [duplicate]每个子组的排名行[重复]
【发布时间】:2020-07-14 02:25:28
【问题描述】:

我有一个与每个子组的行排名有关的问题。假设我有一个公司员工信息的数据。这家公司有三个部门(Alpha、Beta 和 Sigma),每个部门有两个团队(团队 1 和团队 2)。一个人可以是团队的成员或领导者。

问题是一个人可以属于跨部门具有不同角色的多个团队。我想做的是对于多个职位的人,我想对他/她的主要工作是什么,他/她的次要工作是什么进行排名。排名逻辑是职位是最重要的标准:Leader>Member。如果职位相同,则部门是下一个最重要的标准:Alpha>Beta>Sigma。如果部门也是平等的,那么我应该看团队:团队 1>团队>2。以下是结果的示例:

Person_Name  Department_Name  Team_Name     Team_Position   Ranking
       Tony        Alpha              1           Member    1
       Tony        Beta               1           Member    2

       Bill        Alpha              1           Leader    1
       Bill        Alpha              2           Leader    2
       Bill        Beta               1           Leader    3

       Luke        Alpha              1           Member    2
       Luke        Beta               1           Leader    1
       Luke        Sigma              1           Member    3

我想我应该可以使用 dplyr 包来做到这一点。但是,我在代码的细节上苦苦挣扎,不知道如何避免 for/if 循环,因为真实数据有更多的部门和团队。谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    在这种情况下,您可以arrange 数据并为每个Person_Name 分配行号。

    library(dplyr)
    df %>%
      arrange(Person_Name, Team_Position, Department_Name, Team_Name) %>%
      group_by(Person_Name) %>%
      mutate(Ranking = row_number())
    
    
    #  Person_Name Department_Name Team_Name Team_Position Ranking
    #  <chr>       <chr>               <int> <chr>           <int>
    #1 Bill        Alpha                   1 Leader              1
    #2 Bill        Alpha                   2 Leader              2
    #3 Bill        Beta                    1 Leader              3
    #4 Luke        Beta                    1 Leader              1
    #5 Luke        Alpha                   1 Member              2
    #6 Luke        Sigma                   1 Member              3
    #7 Tony        Alpha                   1 Member              1
    #8 Tony        Beta                    1 Member              2
    

    上面的工作是因为"Leader""Member" 更早,同样Department_NameTeam_Name 遵循我们想要的相同顺序。


    更通用的解决方案是将此列更改为我们想要的级别中的因子,然后 arrange 并为 Person_Name 创建 Ranking 列。

    df %>%
      mutate(Team_Position = factor(Team_Position, levels = c('Leader', 'Member')), 
             Department_Name = factor(Department_Name, 
                                  levels = c('Alpha', 'Beta', 'Sigma')), 
             Team_Name = factor(Team_Name, levels = c(1, 2))) %>%
       arrange(Person_Name, Team_Position, Department_Name, Team_Name) %>%
       group_by(Person_Name) %>%
       mutate(Ranking  = row_number())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多