繁体   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