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
,类似的方法是按列 arrange
,filter
基于来自 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'所在的行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]
在 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
,类似的方法是按列 arrange
,filter
基于来自 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'所在的行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]