我在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。如果可能,我想要一个最佳解决方案,而不是限制这两个包。问题甚至可能是投票,因为它可能是家庭作业。
答案 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))