dplyr을 사용하여 각 그룹에서 최대값이 있는 행을 선택하는 방법은 무엇입니까?
저는 dplyr로 각 그룹에서 최대값이 있는 행을 선택하고 싶습니다.
먼저, 저는 제 질문을 보여주기 위해 무작위 데이터를 생성합니다.
set.seed(1)
df <- expand.grid(list(A = 1:5, B = 1:5, C = 1:5))
df$value <- runif(nrow(df))
플라이어에서는 사용자 정의 함수를 사용하여 이 행을 선택할 수 있습니다.
library(plyr)
ddply(df, .(A, B), function(x) x[which.max(x$value),])
dplyr에서는 최대값을 얻기 위해 이 코드를 사용하지만 최대값이 있는 행(이 경우 C열)은 사용하지 않습니다.
library(dplyr)
df %>% group_by(A, B) %>%
summarise(max = max(value))
어떻게 하면 이것을 이룰 수 있을까요?제안해 주셔서 감사합니다.
sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.2 plyr_1.8.1
loaded via a namespace (and not attached):
[1] assertthat_0.1.0.99 parallel_3.1.0 Rcpp_0.11.1
[4] tools_3.1.0
사용해 보십시오.
result <- df %>%
group_by(A, B) %>%
filter(value == max(value)) %>%
arrange(A,B,C)
효과가 있는 것 같습니다.
identical(
as.data.frame(result),
ddply(df, .(A, B), function(x) x[which.max(x$value),])
)
#[1] TRUE
댓글에 지적된 것처럼.slice
@Royal에 따르면 여기서 선호될 수 있습니다.그룹당 한 줄만 엄격하게 원하는 경우 아래 ITS의 답변입니다.이 응답은 최대값이 동일한 행이 여러 개 있는 경우 여러 행을 반환합니다.
df %>% group_by(A,B) %>% slice(which.max(value))
사용할 수 있습니다.top_n
df %>% group_by(A, B) %>% top_n(n=1)
마지막 열에 따라 순위가 매겨집니다(value
) 및 상단을 반환합니다.n=1
행
현재 이 기본값은 오류가 발생하지 않고는 변경할 수 없습니다(https://github.com/hadley/dplyr/issues/426) 참조).
이 보다 자세한 솔루션을 사용하면 최대값이 중복될 경우 발생하는 작업을 보다 효과적으로 제어할 수 있습니다(이 예에서는 해당 행 중 하나를 임의로 사용합니다).
library(dplyr)
df %>% group_by(A, B) %>%
mutate(the_rank = rank(-value, ties.method = "random")) %>%
filter(the_rank == 1) %>% select(-the_rank)
일반적으로, 주어진 그룹 내에서 정렬된 행의 "맨 위"를 선택하는 것이 좋습니다.
단일 값이 최대값으로 표시되는 경우에는 기본적으로 하나의 열만 기준으로 정렬됩니다.그러나 여러 열(예: 날짜 열 및 시간 열)을 기준으로 계층적으로 정렬하는 것이 유용한 경우가 많습니다.
# Answering the question of getting row with max "value".
df %>%
# Within each grouping of A and B values.
group_by( A, B) %>%
# Sort rows in descending order by "value" column.
arrange( desc(value) ) %>%
# Pick the top 1 value
slice(1) %>%
# Remember to ungroup in case you want to do further work without grouping.
ungroup()
# Answering an extension of the question of
# getting row with the max value of the lowest "C".
df %>%
# Within each grouping of A and B values.
group_by( A, B) %>%
# Sort rows in ascending order by C, and then within that by
# descending order by "value" column.
arrange( C, desc(value) ) %>%
# Pick the one top row based on the sort
slice(1) %>%
# Remember to ungroup in case you want to do further work without grouping.
ungroup()
저는 그룹당 값 수를 세는 데 도움이 되었습니다.카운트 테이블을 새 개체로 복사합니다.그런 다음 첫 번째 그룹 특성을 기준으로 그룹의 최대값을 필터링합니다.예:
count_table <- df %>%
group_by(A, B) %>%
count() %>%
arrange(A, desc(n))
count_table %>%
group_by(A) %>%
filter(n == max(n))
또는
count_table %>%
group_by(A) %>%
top_n(1, n)
언급URL : https://stackoverflow.com/questions/24237399/how-to-select-the-rows-with-maximum-values-in-each-group-with-dplyr
'programing' 카테고리의 다른 글
WPF 창이 닫혔는지 어떻게 알 수 있습니까? (0) | 2023.06.06 |
---|---|
한 줄의 코드로 파일 읽기 및 닫기 (0) | 2023.06.06 |
numpy dot()와 Python 3.5+ 행렬 곱셈의 차이 @ (0) | 2023.06.06 |
Python에서 오류 없이 유니코드를 ASCII로 변환 (0) | 2023.06.06 |
특정 폴더의 파일 이름이 데이터베이스 테이블 안에 있는지 확인하는 방법은 무엇입니까? (0) | 2023.06.06 |