我在dplyr中总结一个数据框时,试图在一个组中找到几个因子变量中最常见的值 . 我需要一个执行以下操作的公式:
-
在一个组中的一个变量的所有因子中找到最常用的因子水平(因此基本上"max()"用于因子水平计数) .
-
如果几个最常用因子水平之间存在平局,则选择其中任何一个因子水平 .
-
返回因子级别名称(不是计数) .
有几个公式可行 . 但是,我能想到的那些都很慢 . 快速的那些不方便一次应用于数据帧中的几个变量 . 我想知道是否有人知道一种与dplyr很好地集成的快速方法 .
我尝试了以下方法:
generating sample data (50000 groups with 100 random letters)
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 ...
"Clean"-but-slow approach 1
y <- z %>%
group_by(a) %>%
summarise(c = names(table(b))[which.max(table(b))])
user system elapsed
26.772 2.011 29.568
"Clean"-but-slow approach 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
"Clean"-but-slow approach 3
y <- z %>%
group_by(a) %>%
summarise(c = names(sort(table(b),decreasing = TRUE)[1]))
user system elapsed
35.086 6.905 42.485
"Messy"-but-fast approach
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
4 回答
这是
dplyr
的另一个选项:我们确保这些是等效的方法:
Update
正如@docendodiscimus所提到的,你也可以这样做:
以下是基准测试的结果:
为什么选择dplyr?
编辑:多列
data.table
仍然是最快的选择:标杆:
正如使用data.table可以看到的那样:
要么
似乎是最快的
所有列的更新:
使用@ zx8754的数据
你可以这样做:
只是为了确认结果是一样的:
按照LyzandeR的建议,我将添加另一个答案: