dplyr:: создать новый столбец с порядковым номером другого столбца

#r #dplyr

#r #dplyr

Вопрос:

сначала прошу прощения, если этот вопрос был задан где-то еще, но я не смог найти ответа.

В R у меня есть 2 столбца data.frame со ID Score значениями и .

 library(dplyr)
library(magrittr)

set.seed(1235) # for reproducible example
data.frame(ID = LETTERS[1:16],
           Score = round(rnorm(n=16,mean = 1200, sd = 5 ), 0),
           stringsAsFactors = F) -> tmp

head(tmp)

#    ID Score
# 1  A  1203
# 2  B  1198
# 3  C  1197
# 4  D  1202
# 5  E  1200
# 6  F  1190
  

Я хочу создать новый столбец Position с номерами от 1 до nrow(tmp) , соответствующими уменьшению order Score столбца.

Я могу сделать это в base R с:

 tmp[order(tmp$Score, decreasing = T), "Position"] <- 1:nrow(tmp)
head(tmp[order(tmp$Position), ])

#     ID Score Position
# 1   A  1211        1
# 8   H  1210        2
# 3   C  1209        3
# 4   D  1205        4
# 5   E  1202        5
# 16  P  1202        6
  

Но мне было интересно, есть ли более элегантный способ сделать это, соблюдая tidyverse принципы?
Например, я пробовал это, но это не работает, и я не могу понять, почему…

 tmp %>%
  mutate(Position = order(Score, decreasing = T)) %>%
  arrange(Position) %>%
  head()

#    ID Score Position
# 1  A  1211        1
# 2  L  1200        2
# 3  C  1209        3
# 4  D  1205        4
# 5  E  1202        5
# 6  G  1188        6
  

Здесь упорядочение явно не сработало.

Спасибо!

Ответ №1:

Мы можем использовать row_number

 library(dplyr)
tmp %>% 
    mutate(Position2 = row_number(-Score))
  

-вывод

 #    ID Score Position Position2
#1   A  1197       12        12
#2   B  1194       16        16
#3   C  1205        3         3
#4   D  1201        8         8
#5   E  1201        9         9
#6   F  1208        1         1
#7   G  1200       10        10
#8   H  1203        5         5
#9   I  1207        2         2
#10  J  1202        6         6
#11  K  1195       15        15
#12  L  1205        4         4
#13  M  1196       13        13
#14  N  1198       11        11
#15  O  1196       14        14
#16  P  1202        7         7
  

где «Позиция» — это позиция, созданная на order основе base R кода OP

Ответ №2:

Аналогично вашей order логике, мы можем arrange данные в порядке убывания и создать position столбец, который идет от 1 до количества строк в данных.

 library(dplyr)

tmp %>%
  arrange(desc(Score)) %>%
  mutate(position = 1:n())

#   ID Score position
#1   F  1208        1
#2   I  1207        2
#3   C  1205        3
#4   L  1205        4
#5   H  1203        5
#6   J  1202        6
#7   P  1202        7
#8   D  1201        8
#9   E  1201        9
#10  G  1200       10
#11  N  1198       11
#12  A  1197       12
#13  M  1196       13
#14  O  1196       14
#15  K  1195       15
#16  B  1194       16