是否有比下面更整洁的方法来基于第二列“重新排列”值?
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可以帮上忙吗?在我看来,这个问题似乎很简单明了,令我惊讶的是,到目前为止,我找不到更好的解决方案。