Как преобразовать широкие данные в длинный формат для кросс-классифицированной модели [R, GLMM] - PullRequest
0 голосов
/ 11 июля 2019

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

enter image description here

  • condition - это одно из двух условий, на которые были назначены участники.
  • Участники были протестированы дважды: t1 и t2.
  • Что касается переменных-предикторов уровня элемента, то кодируются x1 и x2.
  • Что касается response, был ли закодирован ответ участников на элемент правильно или неправильно.
  • были введены два формата test, test1 и test2.

Несмотря на то, что существует множество учебных пособий для широкого и длинного преобразования, я не смог найти одно, специально объясняющее преобразование для перекрестно классифицированных моделей.

Я хотел бы использовать tidyverse, если это возможно, для согласованности.

Мой пример данных следующий:

structure(list(item_name = c("x1", "x2", "participant_id", "1", 
"2", "3", "4", "5", "6", "7"), participant_variable_1 = c(NA, 
NA, NA, 20, 23, 21, 20, 19, 22, 30), condition = c(NA, NA, NA, 
"A", "B", "A", "B", "A", "B", "A"), t1.item1.test1 = c(1, 3, 
NA, 0, 1, 0, 1, 0, 0, 1), t1.item2.test1 = c(2, 2, NA, 0, 0, 
0, 1, 1, 0, 1), t1.item3.test1 = c(1, 3, NA, 0, 0, 0, 1, 0, 0, 
0), t1.item4.test1 = c(3, 1, NA, 1, 0, 0, 0, 1, 1, 0), t2.item1.test1 = c(1, 
3, NA, 0, 1, 1, 0, 1, 1, 1), t2.item2.test1 = c(2, 2, NA, 1, 
0, 1, 0, 1, 0, 1), t2.item3.test1 = c(1, 3, NA, 0, 0, 0, 1, 0, 
0, 0), t2.item4.test1 = c(3, 1, NA, 1, 1, 0, 1, 1, 1, 0), t1.item1.test2 = c(1, 
3, NA, 0, 1, 0, 1, 0, 0, 1), t1.item2.test2 = c(2, 2, NA, 0, 
0, 0, 1, 1, 0, 1), t1.item3.test2 = c(1, 3, NA, 0, 0, 0, 1, 0, 
0, 0), t1.item4.test2 = c(3, 1, NA, 1, 0, 0, 0, 1, 1, 0), t2.item1.test2 = c(1, 
3, NA, 0, 1, 1, 0, 1, 1, 1), t2.item2.test2 = c(2, 2, NA, 1, 
0, 1, 0, 1, 0, 1), t2.item3.test2 = c(1, 3, NA, 0, 0, 0, 1, 0, 
0, 0), t2.item4.test2 = c(3, 1, NA, 1, 1, 0, 1, 1, 1, 0)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

Я хотел бы иметьдлинные данные, которые выглядят следующим образом:

enter image description here

Пожалуйста, и спасибо за ваше руководство!

1 Ответ

2 голосов
/ 11 июля 2019

Этот ответ требует интенсивного использования новых функций pivot_ в версии dev tidyr. Вы можете установить это с devtools::install_github("tidyverse/tidyr"), если хотите запустить версию dev.

Сначала мы разбиваем данные на информацию об элементах и ​​участниках - вы не получаете никакой выгоды от хранения обоих в одной таблице:

item_info = dat[1:2, ]
participant_info = dat[4:nrow(dat), ] %>%
    rename(participant_id = item_name)

Тогда пришло время для большого поворота:

# I have the dev version of tidyr so that is being loaded
library(tidyverse)

item_long = item_info %>%
    select(-participant_variable_1, -condition) %>%
    pivot_longer(
        cols = t1.item1:t2.item4,
        names_to = c("time", "item"),
        names_pattern = "t(\\d)\\.(item\\d)",
    ) %>%
    pivot_wider(names_from = item_name, values_from = value)

participant_long = participant_info %>%
    pivot_longer(
        cols = t1.item1:t2.item4,
        names_to = c("time", "item"),
        names_pattern = "t(\\d)\\.(item\\d)",
        values_to = "response"
    )

combined = participant_long %>%
    left_join(item_long, by = c("item", "time"))

Результат:

> combined
# A tibble: 56 x 8
   participant_id participant_variable_1 condition time  item  response    x1    x2
   <chr>                           <dbl> <chr>     <chr> <chr>    <dbl> <dbl> <dbl>
 1 1                                  20 A         1     item1        0     1     3
 2 1                                  20 A         1     item2        0     2     2
 3 1                                  20 A         1     item3        0     1     3
 4 1                                  20 A         1     item4        1     3     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...