r - 改进group_by和summary的运行时间

标签 r dplyr group-by summarize

我有一个包含大约 1000 万员工的数据框 df。每个员工都有一个 ID,还有一个 city 变量和一个显示他们工作地点的 company 变量:

ID city company
1  NYC  ABC
2  BOS  ABC
1  NYC  DEF
3  SEA  GHI

我想按 IDcity 进行分组,然后计算出每个员工工作的公司数量:

ID city count
1  NYC  2
2  BOS  1
3  SEA  1

我的代码是df %>% group_by(ID, city) %>% summarise(count = n_distinct(company)) 然而,这需要很长时间才能运行。我的设置通常支持计算量大的操作,但我很难运行这段代码。

有人有不同的(最好是更快的实现)吗?

编辑:n_distinct(company) 而不是 n_distinct(ID)

最佳答案

这是使用更大(希望具有代表性?)数据集的 data.tabledplyr 解决方案的基准比较。

# Sample data
df <- data.frame(
    ID = sample(c(1:10), 10000, replace = TRUE),
    city = sample(c("NYC", "BOS", "SEA"), 10000, replace = TRUE),
    company = sample(c("ABC", "DEF", "GHI","JKL", "MNO", "PQR", "STU"), 10000, replace = TRUE))

library(data.table)
dt <- as.data.table(df)

library(microbenchmark)
res <- microbenchmark(
    dplyr = df %>% 
        group_by(ID, city) %>% 
        summarise(count = n_distinct(company), .groups = "drop"),
    datatable = dt[, .(count = uniqueN(company)), by = c("ID", "city")]
)
res
#Unit: milliseconds
#     expr      min       lq      mean   median        uq      max neval
#    dplyr 6.843204 7.696959 10.110256 9.915225 10.906205 41.35438   100
#datatable 1.893994 2.255023  2.924953 2.738450  3.395504  7.61165   100

autoplot(res)

enter image description here

关于r - 改进group_by和summary的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73903466/

相关文章:

sql-server - Group By 中的按位运算

C# LINQ,如果没有找到(时间),选择上一个/复制上一个结果

MySQL/MariaDB GROUP BY, ORDER BY 两次返回相同的结果

r - for 循环的替代方案,用于将矩阵中的元素子集替换为 R 中向量中的元素

r - dplyr 中的分组均值

r - 在 R 中加入多个 OR 语句

R dplyr 方法变异变量(如果存在)

R包从日期和小时(整数)构造时间对象

R 使用 ggplot 添加对交互图的调整

r - 如何让分位数与 summarise_at 和 group_by (dplyr) 一起使用