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.

Creando un número aleatorio con valor constante dentro de grupos.

Estoy creando un número aleatorio donde cada miembro de un grupo específico tiene el mismo valor de la variable. Encontré una solución, pero sospecho que no es muy eficiente. Me pregunto si alguien tiene una forma de hacer esto en una línea de código:

library(dplyr)
data(mtcars)

t1 <- Sys.time() #¿Se pueden reemplazar las siguientes dos líneas por una?

a <- data.frame(random = runif(3, 0, 6),
                cyl = seq(4,8,2))

merged <- merge(mtcars, a, by = 'cyl')
t2 <- Sys.time()
t2 - t1
#Verificar que funcione correctamente
merged %>%
  group_by(cyl) %>%
  summarise(across(random, sd))
Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible lograr esto en una línea de código utilizando la función mutate() y la función group_by() de dplyr:

    merged <- mtcars %>% 
              mutate(random = ifelse(cyl == 4, runif(1, 0, 6),
                              ifelse(cyl == 6, runif(1, 0, 6),
                                ifelse(cyl == 8, runif(1, 0, 6), NA)))) %>%
              group_by(cyl) %>%
              fill(random) %>%
              ungroup()
    

    En este caso, utilizamos declaraciones ifelse anidadas para generar un número aleatorio entre 0 y 6 para cada grupo, basado en la variable cyl. Luego, agrupamos los datos por cyl, llenamos los valores faltantes con el último valor no faltante dentro del grupo y finalmente desagrupamos los datos.

Comments are closed.