r - 从组内的两列中提取最大值

标签 r dplyr

<分区>

q分组后,想分别从两个不同的we列中提取两个最大值

输入数据:

q <- c(503,503,503,503,503,503,503,503,503,503,503,503,503,510,510,510,510,510,510,510,510,510,510,510,510,525,526,526)
w <- c(56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56)
e <- c(26,26,26,26,26,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,30,30,30,30,33,33,33)
r <- data.frame(q,w,e, stringsAsFactors = FALSE)

代码:

r %>% group_by(q) %>% slice(which.max(w & e))

我的输出:

  q     w     e
 <dbl> <dbl> <dbl>
1  503.   56.   26.
2  510.   56.   28.
3  525.   56.   33.
4  526.   56.   33.

预期输出:

    q   w  e
1  503 56 28
2  510 56 30
3  525 56 33
4  526 56 33

宁愿使用 %>%slice 命令作为上面的代码,而不是分别寻找最大值 q$w q $e 然后通过 q 合并(想避免 merge 因为我的实际数据很大 object.size ~2GB)

最佳答案

这是快速的 data.table 解决方案,可以很好地扩展到您的 2GB 数据集。

library(data.table)
dt <- data.table(r)
dt[, lapply(.SD, max, na.rm=TRUE), by=q ]

结果

    q  w  e
1: 503 56 28
2: 510 56 30
3: 525 56 33
4: 526 56 33

基准测试

microbenchmark(data.table = dt[, lapply(.SD, max, na.rm=TRUE), by=q ],
               dplyr1 = r %>% group_by(q) %>% summarise_all(max),
               base = do.call(rbind, by(r, r$q, function(x)
               data.frame(q = unique(x$q), w = max(x$w), e = max(x$e)))), times = 50
)

结果

Unit: microseconds
       expr      min       lq     mean   median       uq       max neval
 data.table  810.240 1060.267 1447.979 1192.107 1332.054 14260.901    50
     dplyr1 1562.027 1686.613 1857.382 1759.574 1869.226  3617.279    50
       base 1925.973 2088.107 2448.162 2226.986 2485.760  7395.837    50

显然 data.table 是最快的。

关于r - 从组内的两列中提取最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50096748/

相关文章:

r - 是否有一些函数可以使用 group_by 在 R dplyr 中保留唯一值?

r - dplyr::filter嵌套数据框

使用 dplyr 的 R 滤波器矩阵

r - dplyr和tail更改r中group_by中的最后一个值

r - 通过基于 R 中的键减去值来创建新列?

r - 如何使用 R tidymodels 工作流程在没有截距的情况下拟合模型?

r - 绘制年份的问题

r - 过滤器计数不同 > 1

r - 从类 "simple_triplet_matrix"转换为类 "matrix"

r - 如何在 data.table 中执行 "serial join"?