【问题标题】:Aggregate data in dataframe聚合数据框中的数据
【发布时间】:2015-10-30 02:33:00
【问题描述】:

我在 R 中有以下数据框

DeptNumber  EmployeeTypeId
         1              10
         1              11
         1              11
         2              23
         2              23
         2              30
         2              40
         3              45
         3              46

我需要生成另一个带有新列MaxEmployeeType 的数据框,其中应包含EmployeeTypeId,对于给定的DeptNumber,重复次数最多。输出应该如下

DeptNumber  MaxEmployeeType 
         1              11
         2              23
         3              45

departmentNumber=3 的情况下,有一个平局,但可以提出任何一个选项。我不确定执行此操作的最佳方法是什么?任何帮助表示赞赏。

一个类似的问题已经发布了

How to aggregate data in R with mode (most common) value for each row?

但它有一个限制,只能使用 plyr & lubridate。如果可能的话,我想要一个最好的解决方案,而不是局限于这两个包。这个问题甚至被否决,可能是因为它可能是家庭作业。

【问题讨论】:

  • aggregate(EmployeeTypeId ~ ., dd, function(x) x[duplicated(x) + (sum(duplicated(x)) == 0)][1])
  • aggregate(EmployeeTypeId ~ ., dd, function(x) if (length(y <- x[duplicated(x)])) y else x[1])

标签: r aggregate dplyr


【解决方案1】:

你可以试试:

library(dplyr)
df %>% 
  count(DeptNumber, EmployeeTypeId) %>% 
  top_n(1) %>% 
  slice(1)

或者按照@jazzuro 的建议:

count(df, DeptNumber, EmployeeTypeId) %>% slice(which(n == max(n))[1])

这给出了:

#Source: local data frame [3 x 3]
#Groups: DeptNumber [3]
#
#  DeptNumber EmployeeTypeId     n
#       (int)          (int) (int)
#1          1             11     2
#2          2             23     2
#3          3             45     1

【讨论】:

  • 以类似的方式,我有count(df, DeptNumber, EmployeeTypeId) %>% slice(which(n == max(n))[1])
【解决方案2】:

试试这个。

# Mode function
Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
}
# new data-frame
new_df <- data.frame("DeptNumber" = numeric(0), "MaxEmployeeType" = numeric(0))
# distinct departments
depts <- unique(df$DeptNumber)
# calculate mode for every department
for(dept in depts){
    dept_set <- subset(df, DeptNumber == dept)
    new_df <- rbind(new_df, c(dept, Mode(dept_set$EmployeeTypeId)))
}

R 没有任何用于计算 Mode 的标准函数。上面代码中的模式函数取自 Ken Williams 的帖子here

【讨论】:

    【解决方案3】:

    这是另一个 dplyr 解决方案

    library(dplyr)
    
    data %>%
      count(DeptNumber, EmployeeTypeId) %>%
      slice(which.max(n))
    

    【讨论】:

    • 我们可以使用count()代替group_by()tally()count(df, DeptNumber, EmployeeTypeId) %&gt;% slice(which.max(n))
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2018-09-19
    • 2017-02-05
    • 1970-01-01
    • 2021-04-27
    • 2022-01-21
    相关资源
    最近更新 更多