Eli*_*own 1 r survey data-cleaning tidyverse
我有我正在 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
Run Code Online (Sandbox Code Playgroud)
我想重塑它,使其看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
这样做的有效方法是什么,最好是在 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
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.3.0)于 2020 年 3 月 4 日创建
我们可以重塑为“长”格式,然后将其旋转为“宽”格式
library(dplyr)
library(tidyr)
library(english)
df1 %>%
pivot_longer(cols = -responseid, values_drop_na = TRUE) %>%
separate(name, into = c("name1", "name2"), "(?<=[a-z])(?=[A-Z])") %>%
mutate(value = as.character(ordinal(value))) %>%
pivot_wider(names_from = value, values_from = name2)
Run Code Online (Sandbox Code Playgroud)