Есть ли более аккуратный способ, чем следующие, чтобы "переставить" значения на основе второго столбца?
В df содержатся ответы на вопросы Ликерта, которые были представлены в случайном порядке в вопроснике.Столбцы «элемент» содержат, какой элемент был представлен, столбцы «ответ» содержат ответы.
Цель состоит в том, чтобы иметь df, где столбцы ответа сортируются по столбцу элемента для каждого участника (строки)?
Исходный формат:
## id item.1 response.1 item.2 response.2 item.3 response.3 ... item.x respons.x
## 1 1 2 5 1 4 3 2
## 2 2 3 4 1 5 2 4
## ...
## i
Требуемый формат:
## id order_1 reponse_1 order_2 reponse_2 order_3 reponse_3 ... order_x reponse_x
## 1 1 2 4 1 5 3 2
## 2 2 2 5 3 4 1 4
## ...
## i
Пока мой самый аккуратный подход заключается в следующем:
df <- data_frame(
id = 1:4,
item.1 = c(2,3,2,4),
response.1 = c(4,1,3,2),
item.2 = c(1,2,1,1),
response.2 = c(5,4,5,4),
item.3 = c(3,4,3,2),
response.3 = c(1,2,2,5),
item.4 = c(4,1,4,3),
response.4 = c(2,2,2,1)
)
df_long <- df %>%
unite(col = one, ends_with(".1"), sep = ";") %>%
unite(col = two, ends_with(".2"), sep = ";") %>%
unite(col = three, ends_with(".3"), sep = ";") %>%
unite(col = four, ends_with(".4"), sep = ";") %>%
gather(key = "number", value = "item_response", c(one, two, three, four)) %>%
arrange(id) %>%
separate(item_response, into = c("item", "response"))
Этот начальныйшаг можно было бы также сделать с меньшим количеством строк кода с помощью базовой функции reshape ().
reshape(df, varying = names(df[,-1]), idvar = "id", direction = "long")
Я бы, однако, предпочел решение по тидиверсу.Я нашел эту ветку (https://github.com/tidyverse/tidyr/issues/150) с обсуждением множественного сбора, но похоже, что окончательного решения еще не было.
В конце я даже не хочу, чтобы мои данные былив длинном формате и, следовательно, необходимо распространить его обратно в ширину.
df_final <- df_long %>%
unite(col = order_response, c(number,response), sep = ";") %>%
spread(item, order_response) %>%
separate(`1`, into = c("order_1", "response_1"), sep = ";") %>%
separate(`2`, into = c("order_2", "response_2"), sep = ";") %>%
separate(`3`, into = c("order_3", "response_3"), sep = ";") %>%
separate(`4`, into = c("order_4", "response_4"), sep = ";")
В df, который я использую, у меня, однако, есть 40 элементов вместо 4, что добавляет некоторые тихие строки в код.Есть более аккуратный способ? Я не много работал с мурлыканьем, но может ли этот мур что-то помочь с этим? Мне кажется, проблема проста и проста, и я удивлен, что пока не смог найти лучшего решения для нее.