我在R中有以下数据帧
DeptNumber EmployeeTypeId
1 10
1 11
1 11
2 23
2 23
2 30
2 40
3 45
3 46我需要生成另一个带有新列MaxEmployeeType的数据格式,该列应该包含对给定DeptNumber重复次数最多的EmployeeTypeId。输出应如下
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。如果可能的话,我想要一个最好的解决方案,而不是局限于这两个包。这个问题甚至被否决,可能是因为它可能是家庭作业。
发布于 2015-10-30 03:02:39
你可以试试:
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发布于 2015-10-30 02:56:37
尝尝这个。
# 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的post here。
发布于 2015-10-30 03:02:28
以下是另一种dplyr解决方案
library(dplyr)
data %>%
count(DeptNumber, EmployeeTypeId) %>%
slice(which.max(n))https://stackoverflow.com/questions/33427770
复制相似问题