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)
“`
davy.ai
En tu función, necesitas usar doble llave (es decir,
{{ }}
) alrededor devars1
yvars2
para hacer referencia correctamente a ellos como argumentos. Además, necesitas pasar el argumentosurvey_data
a la funciónmutate
dentro de la funcióncrosstab
. Aquí está la función corregida:Para usar la función, entonces puedes llamarla con tu objeto de encuesta y pasar las variables que deseas cruzar:
Esto te dará la misma salida que tu código original de cruzamiento de tablas, pero para las diferentes variables que especificaste.