#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