es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En R: Crea una columna con valores únicos para cada clúster en otra columna mediante la variable de agrupación.

Tengo un dataframe con la siguiente estructura de datos:

x <- c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "C", "C", "C", "C", "C", "C", "C", "C", "C")
y <- c("Y", "Y", "Y", "Y", "N", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "N", "Y", "Y")
df <- data.frame(x, y)

Quiero crear una nueva columna con valores únicos para cada grupo de Y’s en la columna ‘y’ y un valor para cada N en ‘y’, utilizando dplyr, agrupando por ‘x’. Por ejemplo:

z <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 3)
df <- data.frame(x, y, z)

¿Cómo podría hacer esto?

Intenté modificaciones a la respuesta a esta pregunta https://stackoverflow.com/questions/24119599/how-to-assign-a-unique-id-number-to-each-group-of-identical-values-in-a-column sin éxito.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una nueva columna con valores únicos para cada grupo de Y en la columna ‘y’ y un valor para cada N en ‘y’ usando dplyr, agrupando por ‘x’, puedes usar el siguiente código:

    library(dplyr)

    df %>%
    group_by(x) %>%
    mutate(z = cumsum(c(1, diff(y != lag(y, default = first(y))) != 0)))

    El código utiliza la función group_by() de dplyr para agrupar el marco de datos por ‘x’. Luego, se utiliza la función mutate() para crear una nueva columna llamada ‘z’. La columna ‘z’ se llena utilizando la función cumsum(), que toma un vector lógico que indica si el valor actual en ‘y’ es diferente al anterior y produce una suma acumulativa de estos valores. El vector se crea utilizando las funciones diff() y lag(), que calculan las diferencias entre valores consecutivos y lag() recupera el valor anterior en ‘y’ (con el valor predeterminado del primer valor en la columna para la primera fila). Finalmente, se utiliza la expresión c(1, …) para asegurarse de que se asigna un nuevo número al primer valor de cada grupo.

    El marco de datos resultante ‘df’ debería verse así:

    x y z
    1 A Y 1
    2 A Y 1
    3 A Y 1
    4 A Y 1
    5 A N 2
    6 A N 2
    7 A Y 3
    8 A Y 3
    9 A Y 3
    10 A Y 3
    11 A Y 3
    12 C Y 1
    13 C Y 1
    14 C Y 1
    15 C N 2
    16 C Y 3
    17 C Y 3
    18 C Y 3
    19 C Y 3
    20 C N 4
    21 C Y 5

Comments are closed.