Реструктуризация данных.фрейм

#r #dplyr #tidyverse

Вопрос:

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

 df <- data.frame(userid = c(1, 2, 3), 
                 pos1 = c("itemA_1", "itemB_1", "itemA_2"),
                 pos2 = c("itemB_1", "itemC_2", "itemC_1"),
                 pos3 = c("itemC_5", "itemA_4", "itemB_3")
                 )
df

> df
  userid    pos1    pos2    pos3
1      1 itemA_1 itemB_3 itemC_3
2      2 itemB_1 itemC_1 itemA_1
3      3 itemA_2 itemC_4 itemB_1
 

В ходе опроса несколько пунктов (itemA, itemB, ItemC …) были оценены по пятибалльной шкале лайкерта в диапазоне от 1 до 5. Порядок, в котором были даны ответы на вопросы, также был сохранен.

Например, в приведенных выше данных.фрейм user 1 оценил itemA первым, и рейтинг составил 1. Затем он оценил itemB, и оценка была 3. Наконец он оценил ItemC, и рейтинг был 3. user 2 начал с itemB, и рейтинг был 1 и т. Д.

Очевидно, что эта структура не очень полезна для анализа данных. Поэтому я бы предпочел, чтобы это было в такой форме:

 userid  itemA  itemB  itemC ...
     1      1      3      3
     2      1      1      1
     3      2      1      4
 

Но как я могу туда попасть? Спасибо за помощь!

Ответ №1:

Получите данные в длинном формате, separate значение рейтинга 'item' и получите данные в широком формате.

 library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = starts_with('pos'), names_to = NULL) %>%
  separate(value, c('item', 'rating'), sep = '_', convert = TRUE) %>%
  pivot_wider(names_from = item, values_from = rating)

#  userid itemA itemB itemC
#   <dbl> <int> <int> <int>
#1      1     1     1     5
#2      2     4     1     2
#3      3     2     3     1