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 con levels especificado en reverse of unique elementos de 'G1' y luego coerce a integer con as.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' con reverseofelementos ú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 dataframe result con la columna adicional Group 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