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.

Nombres de variables dinámicas en svydesign del paquete survey

Quiero agregar columnas a un diseño de encuesta creado con el paquete “survey”, lo cual se puede hacer de la siguiente manera:

library(survey)
data(api)

dclus1 <- svydesign(id = ~dnum, weights = ~pw, data = apiclus1, fpc = ~fpc)
dclus2 <- transform(dclus1, 
                    api00_b = api00 + 1)

svymean(~ api00, design = dclus2)

mean SE

api00 644.17 23.542

svymean(~ api00_b, design = dclus2)

mean SE

api00_b 645.17 23.542

Para una tarea más compleja, necesito crear estos nombres de variables dinámicamente a partir de vectores externos. Lo siguiente produce un error, pero creo que proporciona una ilustración de lo que quiero lograr:

```r
vars <- c("api00_a", "api00_b")
dclus2 <- transform(dclus1, 
                    vars[[2]] = api00 + 1)

¿Cómo se podrían implementar nombres dinámicos para las nuevas columnas?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para generar dinámicamente nombres de columna para el objeto survey.design, puedes usar la función paste() para concatenar cadenas. Aquí hay un ejemplo utilizando el vector vars de la pregunta:

    library(survey)
    data(api)
    
    dclus1 <- svydesign(id = ~dnum, weights = ~pw, data = apiclus1, fpc = ~fpc)
    
    vars <- c("api00_a", "api00_b")
    
    # utiliza lapply() y setNames() para crear una lista de data frames transformados
    # con los nombres de columna generados dinámicamente
    dclus_list <- lapply(vars, function(var){
      new_var <- paste(var, "_new", sep = "")
      transform(dclus1, !!new_var := get(var) + 1)
    })
    
    # combina la lista de data frames transformados en un objeto survey.design
    dclus2 <- do.call(cbind, setNames(dclus_list, paste(vars, "_new", sep = "_")))
    
    # calcula la media para las columnas generadas dinámicamente
    svymean(~ api00_a_new, design = dclus2)
    svymean(~ api00_b_new, design = dclus2)
    

    El código anterior crea dos nuevas columnas para cada elemento en el vector vars, con el sufijo _new añadido al nombre de columna original. Las funciones lapply() y setNames() se utilizan para crear una lista de estos data frames transformados, donde cada elemento en la lista se nombra según su correspondiente nombre de columna. Finalmente, do.call() se utiliza para combinar la lista de data frames transformados en un objeto survey.design, que luego se puede utilizar para el análisis.

Comments are closed.