我正在尝试在dplyr中对数据框进行汇总时查找多个因子变量中组内最常见的值。我需要一个能够完成以下任务的公式:
- 在一组中,找到所有因子变量中最常用的因子级别(因子级别计数的“max()”)。
- 如果有几个最常用的因子级别之间存在绑定,则选择其中任何一个因子级别。
- 返回因子级别名称(不是计数的数量)。
有几个可行的公式可以实现这个功能。然而,我能想到的那些公式都很慢。而那些快速的公式又不方便同时适用于数据框中的多个变量。我想知道是否有人知道一种快速的方法,可以很好地集成到dplyr中。
我尝试了以下操作:
生成示例数据(50000组,每组包含100个随机字母)
z <- data.frame(a = rep(1:50000,100), b = sample(LETTERS, 5000000, replace = TRUE))
str(z)
'data.frame': 5000000 obs. of 2 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10 ...
$ b: Factor w/ 26 levels "A","B","C","D",..: 6 4 14 12 3 19 17 19 15 20 ...
"清洁"-但较慢的方法 1
y <- z %>%
group_by(a) %>%
summarise(c = names(table(b))[which.max(table(b))])
user system elapsed
26.772 2.011 29.568
"清洁"-但缓慢的方法2
y <- z %>%
group_by(a) %>%
summarise(c = names(which(table(b) == max(table(b)))[1]))
user system elapsed
29.329 2.029 32.361
"清洁"-但慢速方法 3
y <- z %>%
group_by(a) %>%
summarise(c = names(sort(table(b),decreasing = TRUE)[1]))
user system elapsed
35.086 6.905 42.485
"混乱但快速的方法"
y <- z %>%
group_by(a,b) %>%
summarise(counter = n()) %>%
group_by(a) %>%
filter(counter == max(counter))
y <- y[!duplicated(y$a),]
y <- y$counter <- NULL
user system elapsed
7.061 0.330 7.664
count(z, a, b) %>% slice(which.max(n))
。 - talat