行内整齐重新排列

时间:2018-11-27 12:41:15

标签: r tidyverse

是否有比下面更整洁的方法来基于第二列“重新排列”值?

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个,这在代码中增加了一些内容。有没有更整齐的方法?我没有在purr上做很多工作,但是purr可以帮上忙吗?在我看来,这个问题似乎很简单明了,令我惊讶的是,到目前为止,我找不到更好的解决方案。

0 个答案:

没有答案