根据第二列的顺序对列进行密集排序

时间:2018-12-19 15:30:29

标签: r dplyr

我正在尽全力寻找可能直接解决的问题。我想在数据帧中的列上获得“密集”排名(为data.table::frank函数定义),但不是基于列的正确顺序,该顺序应由另一列({ 1}}(在我的示例中)

我设法通过@Prasad Chalasani 's solution获得了密集排名,就像这样:

val

但是我希望根据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
  • 我尝试了@Prasad Chalasani的两种方法。
  • 我尝试使用data.table::frank(以及idid[rank(val)])来设置sort(val)的顺序。
  • 最后,我还尝试使用order(val)等对级别进行排序,但这会引发错误(rank(val)

  • 我知道可以指定级别顺序,我用它来创建所需的输出。但是,此解决方案并不理想,因为我的数据具有更多的行和级别

为了方便起见,我需要这样做,以便生成具有特定顺序的表,而不是用于计算。

reprex package(v0.2.1)于2018-12-19创建

2 个答案:

答案 0 :(得分:3)

您可以使用first

进行检查
foo_df %>% arrange(val) %>% 
          group_by(id)%>%mutate(id_fac = first(val))%>%
          ungroup()%>%
          mutate(id_fac=as.integer(factor(id_fac)))
# A tibble: 5 x 3
     id    val id_fac
  <dbl> <fctr>  <int>
1     4      a      1
2     1      b      2
3     1      c      2
4     3      d      3
5     3      e      3

答案 1 :(得分:2)

您为什么甚至需要factors?不知道我是否想念什么,但这会提供您想要的输出。

您可以使用match根据id_fac的出现来获取id

library(dplyr)

foo_df %>%
    mutate(id_fac = match(id, unique(id)))

#  id val id_fac
#1  4   a      1
#2  1   b      2
#3  1   c      2
#4  3   d      3
#5  3   e      3