Ранжирование по нескольким столбцам в R - PullRequest
2 голосов
/ 09 марта 2020

Попытка создать индикатор ранга для 2 столбцов, в данном случае и для учетной записи, и для ДАТЫ.

Например:


df <- data.frame(
        Account = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3),
        DATE = c(201901, 201902, 201903, 201904, 201902, 201903, 201904, 201905, 201906, 201907, 201904, 201905))

> df
   Account   DATE
         1 201901
         1 201902
         1 201903
         1 201904
         2 201902
         2 201903
         2 201904
         2 201905
         2 201906
         2 201907
         3 201904
         3 201905

Я пытался использовать ранг и порядок, а также ранг (rank ()) и порядок (order ()), но без удачи

df <- df %>%
  mutate("rank" = rank(Account, DATE))
   Account   DATE rank
         1 201901  2.5
         1 201902  2.5
         1 201903  2.5
         1 201904  2.5
         2 201902  7.5
         2 201903  7.5
         2 201904  7.5
         2 201905  7.5
         2 201906  7.5
         2 201907  7.5
         3 201904 11.5
         3 201905 11.5

Но я хочу, чтобы он ранжировал даты по убыванию, но для каждого аккаунта это должно выглядеть так:

Account   DATE RANK
      1 201901    4
      1 201902    3
      1 201903    2
      1 201904    1
      2 201902    6
      2 201903    5
      2 201904    4
      2 201905    3
      2 201906    2
      2 201907    1
      3 201904    2
      3 201905    1

Ответы [ 4 ]

2 голосов
/ 09 марта 2020

Мы можем использовать нисходящий order для создания рангов:

library(dplyr)

df %>%
  group_by(Account) %>%
  mutate("rank" = order(DATE, decreasing = TRUE))

Вывод:

# A tibble: 12 x 3
# Groups:   Account [3]
   Account   DATE  rank
     <dbl>  <dbl> <int>
 1       1 201901     4
 2       1 201902     3
 3       1 201903     2
 4       1 201904     1
 5       2 201902     6
 6       2 201903     5
 7       2 201904     4
 8       2 201905     3
 9       2 201906     2
10       2 201907     1
11       3 201904     2
12       3 201905     1
2 голосов
/ 09 марта 2020
library("dplyr")

df %>% 
    group_by(Account) %>% 
    mutate("rank" = rank(DATE))
#> # A tibble: 12 x 3
#> # Groups:   Account [3]
#>    Account   DATE  rank
#>      <dbl>  <dbl> <dbl>
#>  1       1 201901     1
#>  2       1 201902     2
#>  3       1 201903     3
#>  4       1 201904     4
#>  5       2 201902     1
#>  6       2 201903     2
#>  7       2 201904     3
#>  8       2 201905     4
#>  9       2 201906     5
#> 10       2 201907     6
#> 11       3 201904     1
#> 12       3 201905     2

Создано в 2020-03-09 пакетом представ (v0.3.0.9001)

1 голос
/ 09 марта 2020

в базе R

sortdata <- lapply(1:3,grep,df[,1])

for(i in sortdata){
  df[i,3] <- order(df[i,2],decreasing=T)
}
1 голос
/ 09 марта 2020

Здесь вы go:

df <- df %>% group_by(Account) %>% mutate(ranking = rank(DATE))
...