我有一个包含大约 1000 万员工的数据框 df
。每个员工都有一个 ID
,还有一个 city
变量和一个显示他们工作地点的 company
变量:
ID city company
1 NYC ABC
2 BOS ABC
1 NYC DEF
3 SEA GHI
我想按 ID
和 city
进行分组,然后计算出每个员工工作的公司数量:
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.table
和 dplyr
解决方案的基准比较。
# 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)
关于r - 改进group_by和summary的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73903466/