R-вложенный для -l oop только для получения результата с последним столбцом в кадре данных - PullRequest
1 голос
/ 26 января 2020

КОНТЕКСТ:

  • Я работаю с данными опроса на уровне респондентов. Каждая строка моего фрейма данных представляет ответы на опрос отдельного человека.
  • Мой фрейм данных состоит из оценок полезности индивидуального уровня из эксперимента «Максимальная разница» И категориальных переменных, указывающих, в какой из нескольких подгрупп находится отдельный респондент опроса.
  • Каждая переменная подгруппы является отдельной категориальной переменной с ровно двумя уровнями. Однако в моем желаемом выводе я хотел бы иметь фрейм данных, где каждый уровень каждой подгруппы имеет свой собственный столбец.

ЦЕЛЬ:

  • Я хочу создать функцию, которая для каждой определенной пользователем подгруппы будет проводить рекурсивные Т-тесты для каждого элемента максимальной разницы во фрейме данных, извлекать элементы из вывода Т-теста и сохранять элементы в фрейме данных.

  • Используя T statisti c результаты в качестве примера, конечный результат должен выглядеть следующим образом:

         Males_T_stat     Females_T_stat
MD_item1      2.71              2.5
MD_item2      1.71              1.5
MD_item3      0.71              0.5

CURRENT КОД:

  • Сейчас я сосредоточен на написании кода для итеративного выполнения T-тестов и сохранения всего выходного объекта каждого теста в списке. Код, который я безуспешно пытался выполнить, приведен ниже:

Создание тестового фрейма данных:

dat <- data.frame(
  md1 = 1:60, 
  gender = factor(rep(c("m", "f"), 30)), 
  generation = factor(rep(c("a", "b"), 30)),
  md2 = 61:120
)

Укажите имена моей подгруппы респондентов (т. Е. категориальные переменные).

groupnames <- c("gender", "generation")

item_vec <- dat %>% select(contains(("md")))
group_vec <- dat[groupnames]

Преобразовать векторы имен подгрупп в кадры данных. этот шаг может быть лишним, но мне удобнее работать с фреймами данных.

item_vec <- data.frame(item_vec)
group_vec <- data.frame(group_vec)

До сих пор я пытался использовать вложенные циклы for для запуска T-тестов и сохранения каждого результата теста в списке. Этот код частично работает; для каждой подгруппы, названной в "group_ve c", код выдает результаты T-теста только для последнего элемента в "item_ve c". Тем не менее, я хочу получить результаты для КАЖДОГО элемента в "item_ve c", где я и остановился.

res <- list()

   for (i in 1:length(group_vec)) {
     res[[i]] <- list(test)
      for (j in 1:length(item_vec)) {
        test <- (t.test(item_vec[[j]] ~ group_vec[[i]])) 
        res[i] <- list(test)
      }
   }

 res

Заранее благодарю за любую помощь, которую вы можете оказать!

1 Ответ

0 голосов
/ 26 января 2020

Во вложенном l oop замените

res[i] <- list(test)

на

res[[i]][[j]] <- list(test)

, поскольку 'j' равно l oop вместо item_vec. Если мы просто присвоим ему значение res[[i]] или res[i], для каждого item_vec в 'group_ve c', оно просто обновит / заменит предыдущее на следующее, и поскольку после последнего ничего не обновляется, последний остается для каждого 'group_ve c'


Кроме того, может быть лучше инициализировать res как

res <- vector('list', length(group_vec))

, а затем внести изменения, как в for л oop

for (i in 1:length(group_vec)) {
     res[[i]] <- list(test)
      for (j in 1:length(item_vec)) {
        test <- (t.test(item_vec[[j]] ~ group_vec[[i]])) 
        res[[i]][[j]] <- list(test)
      }
   }
...