R:如何识别数据框中所有组的最小值索引

R: How to identify indices of minima of all groups in data frame

在 R 中,假设我有一个数据框 times 的时间列:运动员(字符)、季节(整数)、距离(因子,400、800、 1500、5000、10000) 和 tm(浮点数),并希望为其他四个变量的每个唯一组合确定 time 的最低值的行的索引。

我可以使用以下代码执行此操作,该代码按列分组然后按 tm 排序:

times1 <- times # make copy of array
times1$rownum <- 1:nrow(times1) # add column of row numbers
times1 <- times1[with(times1, order(athlete, season, distance, tm)), ] # sort array
whichmins <- times1$rownum[!duplicated(subset(times1, select = -c(tm, rownum)))] # identify rows where grouping factors change

但我想知道是否有使用聚合、dplyr 或数据表的更简洁的方法。 我尝试将 dplyr 的 group_by 函数与 which.min 一起使用,但我无法让它工作。

谢谢

使用 tidyverse,类似的方法是按列 arrangefilter 基于来自 duplicated 和 [=20= 的逻辑向量的不同元素] 'rownum'

library(dplyr)
times %>%
     mutate(rownum = row_number()) %>%
     arrange(athlete, season, distance, tm) %>%
     filter(!duplicated(select(., -c(tm, rownum))) %>%
     pull(rownum)   

或者不使用 duplicated,而是使用 distinct

times %>%
   mutate(rownum = row_number()) %>%
   arrange(athlete, season, distance, tm) %>%
   distinct(across(-c(tm, rownum)), .keep_all = TRUE) %>%
   pull(rownum)   

如果我们想使用分组操作,那么在按'athlete'、'season'、'distance'分组后,切片'tm'所在的行minimum 和 pull 'rownum'

times %>%
    mutate(rownum = row_number())
    group_by(athlete, season, distance) %>%
    slice_min(tm) %>%
    pull(rownum)

summarise

times %>%
    mutate(rownum = row_number())
    group_by(athlete, season, distance) %>%
    summarise(rownum = rownum[which.min(tm)]) %>%
    pull(rownum)

或使用data.table

library(data.table)
setDT(times)[order(athlete, season, distance, tm), 
   .I[!duplicated(.SD[, setdiff(names(.SD), 'tm')), with = FALSE])]]

unique

unique(setorder(setorder(setDT(times, keep.rownames = TRUE),
      athlete, season, distance, tm), by = c('athlete', 'season', 'distance'))[, rn]