#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
andas.integer
— для этой цели есть документация.