簡體   English   中英

R:如何識別數據框中所有組的最小值索引

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

在 R 中,假設我有一個時間數據幀時間列:運動員(字符)、季節(整數)、距離(因子,400、800、1500、5000、10000)和 tm(浮點數)並想要識別其他四個變量的每個唯一組合的最低時間值的行索引。

我可以使用以下代碼執行此操作,該代碼按列分組然后按 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 或 data.tables。 我嘗試將 dplyr 的group_by function 與which.min一起使用,但無法正常工作。

謝謝

使用tidyverse ,類似的方法是按列arrange ,根據duplicated的邏輯向量filter不同的元素並pull “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)   

如果我們想使用 group by 操作,那么在按 'athlete'、'season'、'distance' 分組后,將 'tm' 為min imum 的行切片並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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM