r - 在 R 中清理排名选择调查数据
问题描述
我有我正在用 R 处理的调查数据,其中包括向受访者提供选项列表并要求对他们的前五名进行排名的问题。数据如下所示:
head(data)
responseid ChoiceA ChoiceB ChoiceC ChoiceD ChoiceE ChoiceF
1 001 5 2 1 NA 4 3
2 002 NA 4 3 5 2 1
3 003 3 1 NA 2 4 5
4 004 NA 5 2 1 3 4
我想重塑它,使它看起来像这样:
head(data_new)
responseid first second third fourth fifth
1 001 C B F E A
2 002 F E C B D
3 003 B D A E F
4 004 D C E F B
什么是这样做的有效方法,最好是在 tidyverse 中?我觉得答案将涉及根据其他列的名称更改新列中的值,我不知道该怎么做。
我还将这些数据从 SurveyGizmo 中提取出来,所以如果有人对如何设置它有建议,以便数据以我想要的方式导出到 csv,我也将不胜感激。谢谢!
解决方案
要点是您想要旋转更长的时间,稍微清理一下,然后使用排名作为列名而不是选择来更宽地旋转。这是一种与 akrun 类似的方法,尽管我认为考虑到硬编码顺序列名称的五个选择的限制并不那么复杂。
library(tidyverse)
tbl <- read_table2(
"responseid ChoiceA ChoiceB ChoiceC ChoiceD ChoiceE ChoiceF
001 5 2 1 NA 4 3
002 NA 4 3 5 2 1
003 3 1 NA 2 4 5
004 NA 5 2 1 3 4"
)
tbl %>%
pivot_longer(
cols = -responseid,
names_to = "choice",
values_to = "rank",
values_drop_na = TRUE
) %>%
mutate(
choice = str_remove(choice, "Choice"),
rank = c("first", "second", "third", "fourth", "fifth")[as.integer(rank)]
) %>%
pivot_wider(names_from = rank, values_from = choice) %>%
select(responseid, first, second, third, fourth, fifth)
#> # A tibble: 4 x 6
#> responseid first second third fourth fifth
#> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 001 C B F E A
#> 2 002 F E C B D
#> 3 003 B D A E F
#> 4 004 D C E F B
由reprex 包(v0.3.0)于 2020 年 3 月 4 日创建
推荐阅读
- ios - 配对数组中的重复元素
- javascript - 使用和 Id React 从表中删除一行
- c - 两个整数字符串。检查第二个是否是子字符串
- javascript - 如何从具有 5 深度 VueJS 的关联数组动态创建行跨表
- javascript - python和Gmail App中的Gmail API为同一消息提供不同的messageId
- mariadb - SQL 事件中的游标循环问题
- unity3d - 我想要一个UI按钮,点击它启动功能后,怎么可能?
- android - Android - 确定 LocalTime 是否在一组时间之间(包括午夜过后和午夜之后)
- node.js - 如何正确获取消息错误?
- python - 通过 PyQt5 Webview 中的功能更改 url