Как создать уникальный индекс обратного порядка для каждой группы в R

#r #dplyr

#r #dplyr

Вопрос:

Мои данные выглядят так.

 #My data
df <- structure(list(G1 = c("k", "i", "g", "r", "d", "l", "q", "q", 
"g", "g", "u", "c", "q", "m", "x"), Val = c(-0.451975472583735, 
-0.19872979175927, -0.679638598629673, 0.576615598731837, -1.37035635941051, 
-1.1166732375321, 0.386801159348088, -0.785735341658561, 0.557918504391552, 
-0.0222346091056282, -0.324145474459458, 0.167768244637546, -0.150116509879256, 
0.491114845804244, 0.598188306361648)), class = "data.frame", row.names = c(NA, 
-15L))
 

Я ищу способ идентифицировать каждую группу с уникальным значением, но вместо перехода от 1 к количеству групп я бы хотел, чтобы первая группа начиналась с n групп и так далее, пока последняя группа не будет идентифицирована единицей. Мой идеальный результат был бы:

    G1         Val Group
1   c  0.16776824    11
2   d -1.37035636    10
3   g -0.67963860     9
4   g  0.55791850     9
5   g -0.02223461     9
6   i -0.19872979     8
7   k -0.45197547     7
8   l -1.11667324     6
9   m  0.49111485     5
10  q  0.38680116     4
11  q -0.78573534     4
12  q -0.15011651     4
13  r  0.57661560     3
14  u -0.32414547     2
15  x  0.59818831     1
 

Ответ №1:

Вариант состоит в том, чтобы преобразовать ‘G1’ в factor класс с levels указанным в rev качестве одного из unique элементов ‘G1’, а затем принудительно преобразовать его в integer with as.integer

 library(dplyr)
df %>% 
  mutate(Group2 = as.integer(factor(G1, levels = rev(unique(G1)))))
 

-вывод

 #    G1         Val Group Group2
#1   c  0.16776824    11     11
#2   d -1.37035636    10     10
#3   g -0.67963860     9      9
#4   g  0.55791850     9      9
#5   g -0.02223461     9      9
#6   i -0.19872979     8      8
#7   k -0.45197547     7      7
#8   l -1.11667324     6      6
#9   m  0.49111485     5      5
#10  q  0.38680116     4      4
#11  q -0.78573534     4      4
#12  q -0.15011651     4      4
#13  r  0.57661560     3      3
#14  u -0.32414547     2      2
#15  x  0.59818831     1      1
 

Или, используя match , это просто, вернуть позицию, сопоставив ‘G1’ с rev of другими уникальными` элементами ‘G1’

 df %>%
  mutate(Group2 = match(G1, rev(unique(G1))))
 

-вывод

 #     G1         Val Group Group2
#1   c  0.16776824    11     11
#2   d -1.37035636    10     10
#3   g -0.67963860     9      9
#4   g  0.55791850     9      9
#5   g -0.02223461     9      9
#6   i -0.19872979     8      8
#7   k -0.45197547     7      7
#8   l -1.11667324     6      6
#9   m  0.49111485     5      5
#10  q  0.38680116     4      4
#11  q -0.78573534     4      4
#12  q -0.15011651     4      4
#13  r  0.57661560     3      3
#14  u -0.32414547     2      2
#15  x  0.59818831     1      1
 

Или с помощью base R

 df$Group <-  with(df, match(G1, rev(unique(G1))))
 

данные

 df <- structure(list(G1 = c("c", "d", "g", "g", "g", "i", "k", "l", 
"m", "q", "q", "q", "r", "u", "x"), Val = c(0.16776824, -1.37035636, 
-0.6796386, 0.5579185, -0.02223461, -0.19872979, -0.45197547, 
-1.11667324, 0.49111485, 0.38680116, -0.78573534, -0.15011651, 
0.5766156, -0.32414547, 0.59818831), Group = c(11L, 10L, 9L, 
9L, 9L, 8L, 7L, 6L, 5L, 4L, 4L, 4L, 3L, 2L, 1L)), class = "data.frame",
row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15"))
 

Комментарии:

1.@DarkShadow Чтобы понять функцию, вы всегда можете проверить документацию с ?match ?rev помощью , ?unique . Спасибо

2. @DarkShadow пожалуйста, обратите внимание, что ответ SO не является местом для подробных объяснений используемых функций, таких как factor and as.integer — для этой цели есть документация.