首页 > 解决方案 > 在 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,我也将不胜感激。谢谢!

标签: rtidyversedata-cleaningsurvey

解决方案


要点是您想要旋转更长的时间,稍微清理一下,然后使用排名作为列名而不是选择来更宽地旋转。这是一种与 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 日创建


推荐阅读