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.

Operador rizado dentro de la función de encuesta.

Tengo datos de encuestas con una columna de peso como este ejemplo ficticio:

df <- structure(
list(
device = c(
"Digital",
"No Device",
"No Device",
"Digital",
"Digital",
"No Device",
"Digital",
"Digital",
"Analouge",
"Digital"
),
sex = structure(c(1, 2, 2, 1, 1, 1, 1, 2, 2, 1), format.spss = "F8.2"),
region = structure(c(15, 3, 18, 18, 30, 18, 54, 50, 30,
38), format.spss = "F8.0"),
age_group = structure(c(3, 3,
5, 7, 6, 4, 7, 7, 6, 7), format.spss = "F8.2"),
weight = structure(
c(
845.674012066483,
523.065753702848,
551.805833394951,
454.282517089281,
1234.09384828581,
1046.04985735983,
994.717870661103,
1013.62211131793,
1307.98181670913,
544.360713556522
),
format.spss = "F8.2"
)
),
row.names = c(NA,
-10L),
class = c("tbl_df", "tbl", "data.frame")
)

Estoy utilizando el paquete srvyr para crear un objeto de encuesta y realizar mi análisis:

library(srvyr)
sv_sample <- df %>%
srvyr::as_survey_design(weights = weight)

Aquí estoy haciendo una interacción de tabla cruzada entre el dispositivo y el sexo, por ejemplo, y todo está bien:

sv_sample %>%
mutate(sex = as.factor(sex)) %>%
mutate_at(vars(device),
fct_explicit_na,
na_level = "to_impute") %>%
group_by(sex, device) %>%
summarize(
proportion = srvyr::survey_mean(na.rm = TRUE),
total = srvyr::survey_total(na.rm = TRUE)
) %>%
select(-proportion_se, -total_se) %>%
ungroup()

Resultado:

# A tibble: 5 x 4
  sex   device    proportion total
  <fct> <fct>          <dbl> <dbl>
1 1     Digital        0.796 4073.
2 1     No Device      0.204 1046.
3 2     Analouge       0.385 1308.
4 2     Digital        0.298 1014.
5 2     No Device      0.316 1075.

Necesito crear una tabla cruzada similar para dispositivo vs. otras variables demográficas en mis datos, como edad, región, tamaño de familia, etc. Entonces, en lugar de copiar y pegar el fragmento de la tabla cruzada varias veces, intenté hacer una función con el operador Curly curly. ¿Qué me falta aquí?

“`
crosstab <- function(survey_data, vars1, vars2) {
mutate(demo = as.factor{{ vars1 }})%>%
mutate_at(vars{{ vars2 }},
fct_explicit_na,
na_level = "to_impute")%>%
group_by(demo, {{ vars2 }}) %>%
summarize(
proportion = srvyr::survey_mean(na.rm = TRUE),
total = srvyr::survey_total(na.rm = TRUE)
)%>%
select(-proportion_se, -total_se)%>%
ungroup()
}

crosstab(sv_sample, sex, device)
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En tu función, necesitas usar doble llave (es decir, {{ }}) alrededor de vars1 y vars2 para hacer referencia correctamente a ellos como argumentos. Además, necesitas pasar el argumento survey_data a la función mutate dentro de la función crosstab. Aquí está la función corregida:

    crosstab <- function(survey_data, vars1, vars2) {
      survey_data %>% 
        mutate(demo = as.factor({{ vars1 }})) %>%
        mutate_at({{ vars2 }}, 
                  fct_explicit_na, 
                  na_level = "to_impute") %>%
        group_by(demo, {{ vars2 }}) %>% 
        summarize(proportion = srvyr::survey_mean(na.rm = TRUE), 
                  total = srvyr::survey_total(na.rm = TRUE)) %>% 
        select(-proportion_se, -total_se) %>% 
        ungroup()
    }
    

    Para usar la función, entonces puedes llamarla con tu objeto de encuesta y pasar las variables que deseas cruzar:

    crosstab(sv_sample, sex, device)
    crosstab(sv_sample, age_group, device)
    crosstab(sv_sample, region, device)
    

    Esto te dará la misma salida que tu código original de cruzamiento de tablas, pero para las diferentes variables que especificaste.

Comments are closed.