![](/img/trans.png)
[英]Find row maximum across columns by using vector of column names in 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
或使用rowRanks
從matrixStats
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.