привести в порядок ряды - PullRequest
0 голосов
/ 27 ноября 2018

Есть ли более аккуратный способ, чем следующие, чтобы "переставить" значения на основе второго столбца?

В 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, что добавляет некоторые тихие строки в код.Есть более аккуратный способ? Я не много работал с мурлыканьем, но может ли этот мур что-то помочь с этим? Мне кажется, проблема проста и проста, и я удивлен, что пока не смог найти лучшего решения для нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...