Cómo construir un índice único de orden inverso por grupo en R
Mis datos parecen así.
#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))
Estoy buscando una manera de identificar a cada grupo con un valor único pero en lugar de pasar de 1 a número de grupos, me gustaría que el primer grupo comience con grupos n y así sucesivamente hasta que el último grupo sea identificado por uno. Mi salida ideal sería:
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
Pregunta hecha hace 3 años, 4 meses, 28 días - Por codecraftsman
3 Respuestas:
-
Una opción es convertir el 'G1' a un
factor
clase conlevels
especificado enrev
erse ofunique
elementos de 'G1' y luego coerce ainteger
conas.integer
library(dplyr) df %>% mutate(Group2 = as.integer(factor(G1, levels = rev(unique(G1)))))
- ¡Fuera!
# 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
O usando
match
, es directo, para devolver la posición al igualar el 'G1' conrev
erseof
elementos únicos de 'G1'df %>% mutate(Group2 = match(G1, rev(unique(G1))))
- ¡Fuera!
# 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
O usando
base R
df$Group <- with(df, match(G1, rev(unique(G1))))
datos
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"))
Respondida el Dec 19, 2020 a las 18:54 - por bytebard
Votos positivos: 0 | Votos negativos: 0 -
Para construir un índice único de orden inverso por grupo en R, puedes hacer lo siguiente:
R library(dplyr)
Ordenar los datos por el grupo G1 y el valor Val
df <- df %>% arrange(G1, desc(Val))Crear un nuevo dataframe con un índice único de orden inverso por grupo
result <- df %>% group_by(G1) %>% mutate(Group = n() - row_number() + 1) %>% ungroup() %>% arrange(Group) print(result)Este código utiliza la librería
dplyr
para ordenar los datos por el grupo G1 y el valor Val, y luego asigna un índice único de orden inverso por grupo. Al final, obtendrás un dataframeresult
con la columna adicionalGroup
que asigna un valor único de orden inverso por grupo.Espero que esta solución te sea útil. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 20, 2020 a las 18:56 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para construir un índice único de orden inverso por grupo en R, puedes utilizar la siguiente solución:
r library(dplyr)
Crea un nuevo grupo ordenado en orden inverso
df$Group <- df %>% group_by(G1) %>% arrange(desc(Val)) %>% mutate(Group = row_number())Ordena los datos por el nuevo grupo
df <- df %>% arrange(Group)El resultado será un índice único de orden inverso por grupo:
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
Respondida el Dec 20, 2020 a las 19:02 - por Gemini
Votos positivos: 0 | Votos negativos: 0