【发布时间】:2018-12-19 15:30:29
【问题描述】:
我正在为一些可能直截了当的事情绞尽脑汁。我想在数据框中的列上获得“密集”排名(为data.table::frank 函数定义),但不是基于列的正确顺序,顺序应该由另一列给出(val in我的例子)
我设法获得了@Prasad Chalasani 's solution 的密集排名,就像这样:
library(dplyr)
foo_df <- data.frame(id = c(4,1,1,3,3), val = letters[1:5])
foo_df %>% arrange(val) %>% mutate(id_fac = as.integer(factor(id)))
#> id val id_fac
#> 1 4 a 3
#> 2 1 b 1
#> 3 1 c 1
#> 4 3 d 2
#> 5 3 e 2
但我希望根据val 对因子水平进行排序。期望的输出:
foo_desired <- foo_df %>% arrange(val) %>% mutate(id_fac = as.integer(factor(id, levels = c(4,1,3))))
foo_desired
#> id val id_fac
#> 1 4 a 1
#> 2 1 b 2
#> 3 1 c 2
#> 4 3 d 3
#> 5 3 e 3
- 我试过
data.table::frank - 我尝试了@Prasad Chalasani 的两种方法。
- 我尝试使用
id[rank(val)](以及sort(val)和order(val))设置id的顺序。 最后,我还尝试使用
rank(val)等对级别进行排序,但这会引发错误 (Evaluation error: factor level [3] is duplicated.)我知道可以指定级别顺序,我使用它来创建所需的输出。然而,这个解决方案并不是很好,因为我的数据有更多的行和级别
为了方便起见,我需要它来生成具有特定顺序的表,而不是用于计算。
由reprex package (v0.2.1) 于 2018 年 12 月 19 日创建
【问题讨论】: