programing

dplyr을 사용하여 각 그룹에서 최대값이 있는 행을 선택하는 방법은 무엇입니까?

skycolor 2023. 6. 6. 08:08
반응형

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

반응형