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.

reasignar aleatoriamente la membresía de un grupo con una condición

Tengo la siguiente tabla:

name group
a 1
b 1
c 2
d 2
e 3
f 3

y quiero reasignar aleatoriamente la membresía de grupos asegurándome de que los nombres no se asignen al mismo grupo, y de que la probabilidad de la membresía del grupo permanezca igual. Además, estoy tratando de evitar que todos los nombres bajo el mismo grupo sean asignados al mismo nuevo grupo. En esencia, quiero lograr algo como esto:

name group new.group
a 1 2
b 1 3
c 2 1
d 2 3
e 3 1
f 3 2

¿Cómo puedo hacer esto en R?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para reasignar aleatoriamente la membresía del grupo basándose en las condiciones especificadas, podemos seguir estos pasos:

    1. Crear una tabla de todas las posibles combinaciones de nombre y nuevo grupo, asegurándonos de que el nuevo grupo no sea igual al grupo original y no esté asignado a ningún otro nombre en el mismo grupo original. Podemos usar la función ‘combn’ para generar todas las combinaciones y aplicar las condiciones usando la función ‘filter’ del paquete ‘dplyr’.
    library(dplyr)
    
    df <- data.frame(name = c("a", "b", "c", "d", "e", "f"),
                     group = c(1, 1, 2, 2, 3, 3))
    
    possible_combinations <- expand.grid(name = df$name,
                                         new.group = 1:3)
    
    df_new <- possible_combinations %>% 
      filter(new.group != group) %>% 
      group_by(group) %>% 
      filter(!new.group %in% group) %>% 
      ungroup()
    

    El resultado df_new contendrá todas las posibles combinaciones de nombre y nuevo grupo que cumplan con las condiciones especificadas.

    1. Calcular la probabilidad de la membresía al nuevo grupo basándose en la membresía al grupo original. Podemos usar la función ‘table’ para contar el número de nombres en cada grupo y dividirlo por el número total de nombres. Luego podemos usar la función ‘sample’ para asignar aleatoriamente el nuevo grupo basándose en estas probabilidades.
    prob <- table(df$group) / nrow(df)
    
    df_new$prob <- prob[match(df_new$group, names(prob))]
    df_new$new.group <- sapply(df_new$prob, function(p) sample(df_new$new.group[df_new$prob == p], 1))
    

    El resultado df_new contendrá el nuevo grupo asignado aleatoriamente para cada nombre, basándose en las condiciones y probabilidades especificadas.

    1. Combinar la tabla original y la nueva tabla para obtener la tabla final.
    df_final <- merge(df, df_new, by = "name")
    
    df_final <- df_final[, c("name", "group.x", "new.group")]
    colnames(df_final) <- c("name", "group", "new.group")
    

    El resultado df_final contendrá el nombre y grupo original, así como el nuevo grupo asignado aleatoriamente basándose en las condiciones y probabilidades especificadas.

Comments are closed.