簡體   English   中英

如何使用 dplyr 查找列在一行中的排名?

[英]How to find where a column ranks across a row using dplyr?

假設我有一個如下所示的數據框:

dat <- data.frame(
  Iowa = c(11, 12, 15),
  Wisconsin = c(10, 14, 12),
  Florida = c(14, 9, 11)
)

我想獲得愛荷華州相對於其他列的行列排名。 所以輸出看起來像這樣:

out <- data.frame(
  Iowa = c(11, 12, 15),
  Wisconsin = c(10, 14, 12),
  Florida = c(14, 9, 11),
  IowaRank = c(2, 2, 1)
)

使用 R 實現這一目標的最佳方法是什么,最好是在dplyr管道中?

最簡單的將apply循環行,應用rank提取第一行

dat$IowaRank <- apply(-dat, 1, rank)[1,]

-輸出

dat
  Iowa Wisconsin Florida IowaRank
1   11        10      14        2
2   12        14       9        2
3   15        12      11        1

或使用rowRanksmatrixStats

library(matrixStats)
dat$IowaRank <- rowRanks(-as.matrix(dat))[,1]

或者用dplyr

library(dplyr)
dat %>%
    rowwise %>%
    mutate(IowaRank = rank(-c_across(everything()))[1]) %>%
    ungroup
# A tibble: 3 x 4
   Iowa Wisconsin Florida IowaRank
  <dbl>     <dbl>   <dbl>    <dbl>
1    11        10      14        2
2    12        14       9        2
3    15        12      11        1

您可以使用dense_rank獲取所有列的dense_rank -

library(dplyr)
library(tidyr)

dat %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row) %>%
  group_by(row) %>%
  mutate(rank = dense_rank(-value)) %>%
  ungroup %>%
  pivot_wider(names_from = name, values_from = c(value, rank)) %>%
  select(-row)

#  value_Iowa value_Wisconsin value_Florida rank_Iowa rank_Wisconsin rank_Florida
#       <dbl>           <dbl>         <dbl>     <int>          <int>        <int>
#1         11              10            14         2              3            1
#2         12              14             9         2              1            3
#3         15              12            11         1              2            3

如果您只對使用rowwise的愛荷華州排名感興趣,您可以這樣做 -

dat %>%
  rowwise() %>%
  mutate(IowaRank = dense_rank(-c_across())[1])

#   Iowa Wisconsin Florida IowaRank
#  <dbl>     <dbl>   <dbl>    <int>
#1    11        10      14        2
#2    12        14       9        2
#3    15        12      11        1

暫無
暫無

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

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