Saltar al contenido

R – Agrupa por variable y luego asigna una ID única

Te traemos el arreglo a esta dificultad, al menos eso esperamos. Si presentas dudas puedes dejar un comentario, que sin dudarlo te ayudaremos

Solución:

dplyr tiene un group_indices función para crear ID de grupo únicos

library(dplyr)
data <- data.frame(personal_id = c("111-111-111", "999-999-999", "222-222-222", "111-111-111"),
                       gender = c("M", "F", "M", "M"),
                       temperature = c(99.6, 98.2, 97.8, 95.5))

data$group_id <- data %>% group_indices(personal_id) 
data <- data %>% select(-personal_id)

data
  gender temperature group_id
1      M        99.6        1
2      F        98.2        3
3      M        97.8        2
4      M        95.5        1

O dentro de la misma canalización (https://github.com/tidyverse/dplyr/issues/2160):

data %>% 
    mutate(group_id = group_indices(., personal_id))

dplyr::group_indices() está en desuso a partir de dplyr 1.0.0. dplyr::cur_group_id() debe usarse en su lugar:

df %>%
 group_by(personal_id) %>%
 mutate(group_id = cur_group_id())

  personal_id gender temperature group_id
                     
1 111-11-1111 M             99.6        1
2 999-999-999 F             98.2        3
3 111-11-1111 M             97.8        1
4 999-999-999 F             98.3        3
5 888-88-8888 F             99          2
6 111-11-1111 M             98.9        1

Usando el paquete dplyr:

library(dplyr)
data <- data.frame(personal_id = c("111-111-111", "999-999-999", "222-222-222", "111-111-111"),
                 gender = c("M", "F", "M", "M"),
                 temperature = c(99.6, 98.2, 97.8, 95.5))

primero extrae el personal_id para crear una identificación única:

cases <- data.frame(levels = levels(data$personal_id))

usando nombres de fila, obtienes un identificador único:

cases <- cases %>%
    mutate(id = rownames(cases))

resultados:

       levels id
1 111-111-111  1
2 222-222-222  2
3 999-999-999  3

luego se une al marco de datos de casos con sus datos:

data <- left_join(data, cases, by = c("personal_id" = "levels"))

crea una identificación más única pegando la identificación generada con el género:

mutate(UID = paste(id, gender, sep=""))

y finalmente elimine el personal_id y el id simple:

select(-personal_id, -id)

y ahí lo tienes :):

data <- left_join(data, cases, by = c("personal_id" = "levels")) %>%
        mutate(UID = paste(id, gender, sep="")) %>%
        select(-personal_id, -id)

resultados:

  gender temperature UID
1      M        99.6  1M
2      F        98.2  3F
3      M        97.8  2M
4      M        95.5  1M

valoraciones y reseñas

Recuerda recomendar este artículo si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *