如何在r中的数据框中按行对数字数据进行排名?

Ami*_*mit 2 r dplyr tidyr

我有一个近 5000 列的数据框。这是数据框的片段

df= data.frame(a=c(13,17,19,7,9),
           b=c(1,3,50,NA,3),
           c=c(NA,NA,NA,NA,9))
Run Code Online (Sandbox Code Playgroud)

我想对数据框单元格的值进行排序

预期产出

df= data.frame(a=c(1,1,2,1,1),
               b=c(2,2,1,NA,2),
               c=c(NA,NA,NA,NA,1))
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

我们可以使用pmap循环遍历每一行(与 相比会更快rowwise)并应用dense_rank

library(purrr)
library(dplyr)
df %>% 
    pmap_dfr(~ setNames(dense_rank(-c(...)), names(c(...))))
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 5 x 3
      a     b     c
  <int> <int> <int>
1     1     2    NA
2     1     2    NA
3     2     1    NA
4     1    NA    NA
5     1     2     1
Run Code Online (Sandbox Code Playgroud)

或者更快的选项可能是使用dapplyfromcollapse

library(collapse)
library(data.table)
dapply(df, MARGIN = 1, FUN = frank, ties.method = 'dense', na.last = "keep")
  a  b  c
1 2  1 NA
2 2  1 NA
3 1  2 NA
4 1 NA NA
5 2  1  2
Run Code Online (Sandbox Code Playgroud)