Запуск R t.test во вложенных циклах

Я новичок в R Studio. Для занятий я взял набор данных о выборах переписи населения США 2016 года и хочу провести серию Т-тестов над набором данных. Некоторые особенности набора данных. Во-первых, данные кодируются - от 1 до 4 - представляющие состояние гражданства. Я хочу посмотреть, влияют ли различные факторы на вероятность голосования (1 = да или 2 = нет).

Вот код:

factor <- c("Age", "Fathers_country_of_birth", "Mothers_country_of_birth","Highest_level_of_School_completed", "Country_of_birth")
citizen <- c("NATIVE, BORN IN THE UNITED STATES", "NATIVE, BORN IN PUERTO RICO OR OTHER U.S. ISLAND AREAS", "NATIVE, BORN ABROAD OF AMERICAN PARENT OR PARENTS", "FOREIGN BORN, U.S. CITIZEN BY NATURALIZATION")

for (f in factor) {
  print(f)
for (i in 1:4){
  print(paste("Citizenship is", citizen[i] ))
  query <- paste("select * from result2 where Citizenship = ",i)

 sample <- sqldf(query) 
  print(
  (t.test(f ~ Vote_in_Election, data=sample, var.equal = FALSE) ) ) 

} }

И выдает ошибку "переменная длина"

> [1] "Age" [1] "Citizenship is NATIVE, BORN IN THE UNITED STATES"  Show
> Traceback Error in model.frame.default(formula = f ~ Vote_in_Election,
> data = sample) : variable lengths differ (found for
> 'Vote_in_Election')

Если я уберу внешний цикл, я смогу запустить его нормально, конечно, я должен вводить значения в «коэффициент» одно за другим.

Запуская R Studio версии 1.1.463, R — это 3.5.2 в Windows 10.

Поскольку при переборе i будут разные строки данных, я попытался установить парное значение = FALSE, и оно все еще кричало на меня.

Я просмотрел SO, но не нашел решения. Что мне не хватает?


person Matthew Coblentz    schedule 10.03.2019    source источник
comment
одно опубликованное предложение было о var.test, но это решение тоже не работает.   -  person Matthew Coblentz    schedule 11.03.2019
comment
Обратите внимание, что sqldf можно записать: sample <- fn$sqldf("select * from result2 where Citizenship = $i")   -  person G. Grothendieck    schedule 11.03.2019


Ответы (1)


Чтобы динамически построить формулу, вам нужно привести строковую версию формулы внутри as.formula:

t.test(as.formula(paste(f, "~ Vote_in_Election")), data=sample, var.equal = FALSE) 

Или используйте reformulate:

t.test(reformulate("Vote_in_Election", response=f), data=sample, var.equal = FALSE)
person Parfait    schedule 11.03.2019
comment
Потрясающий. Это сработало как шарм. Большое спасибо. Я боролся с этим. - person Matthew Coblentz; 11.03.2019