在数据框中聚合数据

时间:2015-10-30 02:33:01

标签: r aggregate dplyr

我在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

如果是{{1}},则存在平局,但可以显示任一选项。我不确定这样做的最佳方法是什么?任何帮助表示赞赏。

已发布类似问题

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

但它仅限于使用plyr& lubridate。如果可能,我想要一个最佳解决方案,而不是限制这两个包。问题甚至可能是投票,因为它可能是家庭作业。

3 个答案:

答案 0 :(得分:4)

你可以尝试:

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

答案 1 :(得分:1)

试试这个。

# 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没有任何标准功能来计算模式。上面代码中的模式功能取自Ken Williams的帖子here

答案 2 :(得分:1)

这是另一个dplyr解决方案

library(dplyr)

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