У меня есть следующие данные:
dat <- data.frame(id = c("A", "B", "C"),
Q1r1_pepsi = c(1,0,1),
Q1r1_cola = c(0,0,1),
Q1r2_pepsi = c(1,1,1),
Q1r2_cola = c(0,1,1),
stringsAsFactors = FALSE)
, где Q1r1 и Q1r2 - рейтинговые вопросы в опросе, а pepsi и cola - оцениваемые бренды. Итак, у меня есть два рейтинга (r1 и r2) для двух брендов (pepsi, cola):
id Q1r1_c1 Q1r1_c2 Q1r2_c1 Q1r2_c2
"A" 1 0 1 0
"B" 0 0 1 1
"C" 1 1 1 1
(Дополнительный вопрос: как мне отформатировать сообщение SO, чтобы оно правильно содержало красиво отформатированный вывод, который я будет получено при вызове dat
в консоли R?)
Для анализа данных мне нужно изменить (развернуть) данные таким образом, чтобы в строках были указаны уникальные пары рейтинг-бренд. Таким образом, ожидаемый результат будет следующим:
id brand Q1r1 Q1r2
"A" "pepsi" 1 1
"A" "cola" 0 0
"B" "pepsi" 0 1
"B" "cola" 0 1
"C" "pepsi" 1 1
"C" "cola" 1 1
В настоящее время я всегда делаю комбинацию pivot_longer
и pivot_wider
, но я надеялся, что смогу напрямую получить этот результат с помощью pivoting_longer без выполнения промежуточного шаг:
library(tidyverse)
dat_long <- dat %>%
pivot_longer(cols = starts_with("Q1")) %>%
separate(name, into = c("item", "brand"), remove = FALSE)
dat_wide <- dat_long %>%
pivot_wider(id_cols = c(id, brand),
names_from = item,
values_from = value)
В этом текущем примере все еще нормально делать этот промежуточный шаг, но он становится утомительным в других менее чистых примерах, например, предположим, что мои столбцы не были названы в хорошей структуре с Q1r1_c1, Q1r1_c2, Q1r2_c1, Q1r2_c2
, но вместо этого будет Q4, Q5, Q8r1, Q8r2
, где карта будет между Q4 и Q8r1 и Q5 / Q8r2, соответственно.