Использование переформулировки с несколькими входными данными

#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