#r #dplyr #survey
Вопрос:
Короткий Вопрос:
используя переформулировку, я могу сгенерировать следующее:
reformulate(sprintf('interaction(%s)', "Q50_1"))
~interaction(Q50_1)
Как я могу создать что-то подобное, не добавляя это в строку «Q50_1»:
~interaction(Q50_1, gender=="F")
Я мог бы это сделать, но я хочу добавить их в качестве отдельных аргументов.
reformulate(sprintf('interaction(%s)', "Q50_1, gender=='F'"))
~interaction(Q50_1, gender == "F")
Полный Вопрос:
Я использую пакет опроса svymean для получения частот SE и кросс-таблиц взвешенных данных. Я борюсь с функцией переформулировки.
Это мои данные:
data <- read_table2("Q50_1 Q50_2 Q38 Q90 pov gender wgt id
yes 3 Yes NA High M 1.3 A
NA 4 No 2 Med F 0.4 B
no 2 NA 4 Low F 1.2 C
maybe 3 No 2 High M 0.5 D
yes NA No NA High M 0.7 E
no 2 Yes 3 Low F 0.56 F
maybe 4 Yes 2 Med F 0.9 G
")
Создайте объект проектирования:
design <- svydesign(id =~id,
weights = ~wgt,
nest = FALSE,
data = data)
Пользовательская функция для перебора имен столбцов и создания соответствующего формата для чтения в функцию. Пример [«~взаимодействие(Q50_1)»].
vars1 <- c("Q50_1", "Q38")
create_df<- function(design, vector_vars){
# function to retrieve the weighted, mean and se
myfun <- function(x){
form <- reformulate(sprintf('interaction(%s)', x))
cbind(as.data.frame(svymean(form, design, na.rm = T)))
}
final <- do.call(rbind, lapply(vector_vars, myfun))
return(final)
}
create_df(design, vars1)
Это работает так, как и ожидалось:
mean SE
interaction(Q50_1)maybe 0.2713178 0.1932617
interaction(Q50_1)no 0.3410853 0.2233323
interaction(Q50_1)yes 0.3875969 0.2331215
interaction(Q38)No 0.3669725 0.2130455
interaction(Q38)Yes 0.6330275 0.2130455
Это то, что я пробежал раньше:
svymean(~interaction(Q50_1), design, na.rm = T)
Но теперь я хочу изменить формат, чтобы я мог запускать взаимодействие с определенным значением другого столбца. Например, для запуска Q50_1 женщиной:
svymean(~interaction(Q50_1, gender=="F"), design, na.rm = T)
Чтобы автоматизировать вышесказанное, я попытался добавить переменную «столбец» в функцию abouve, которая добавила бы объект «форма», но переформулировка ведет себя не так, как ожидалось. Есть какие-нибудь предложения о том, как я мог бы этого достичь?
Попытка добавить вторую спецификацию в объект формы
create_df_new<- function(design, vector_vars, column){
# function to retrieve the weighted, mean and se
myfun <- function(x){
form <- reformulate(sprintf('interaction(%s)', x, column))
cbind(as.data.frame(svymean(form, design, na.rm = T)))
}
final <- do.call(rbind, lapply(vector_of_vars, myfun))
return(final)
}
create_df_new(design, vars1, "gender==F")
Комментарии:
1. в вашем коде есть опечатка
vector_vars
иvector_of_vars
Ответ №1:
Значение fmt
должно соответствовать количеству переданных аргументов sprintf
. В коде операции есть только один %s
, в то время как входные данные — «x» и «столбец». Кроме того, существует разница между "gender == F"
и 'gender == "F"'
при построении формулы. Первый может проверять наличие FALSE
значений, в то время как второй проверяет наличие строки «F».
library(survey)
create_df_new <- function(design, vector_vars, column){
# function to retrieve the weighted, mean and se
myfun <- function(x){
form <- reformulate(sprintf('interaction(%s, %s)', x, column))
cbind(as.data.frame(svymean(form, design, na.rm = TRUE)))
}
final <- do.call(rbind, lapply(vector_vars, myfun))
return(final)
}
create_df_new(design, vars1, 'gender=="F"')
-выход
mean SE
interaction(Q50_1, gender == "F")maybe.FALSE 0.09689922 0.10433556
interaction(Q50_1, gender == "F")no.FALSE 0.00000000 0.00000000
interaction(Q50_1, gender == "F")yes.FALSE 0.38759690 0.23312149
interaction(Q50_1, gender == "F")maybe.TRUE 0.17441860 0.17253314
interaction(Q50_1, gender == "F")no.TRUE 0.34108527 0.22333227
interaction(Q50_1, gender == "F")yes.TRUE 0.00000000 0.00000000
interaction(Q38, gender == "F")No.FALSE 0.27522936 0.19411565
interaction(Q38, gender == "F")Yes.FALSE 0.29816514 0.24925980
interaction(Q38, gender == "F")No.TRUE 0.09174312 0.09968017
interaction(Q38, gender == "F")Yes.TRUE 0.33486239 0.21984468