![](/img/trans.png)
[英]Applying function across all cells of data frame and return indices (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.