Очистка данных выборочного ранга в R - PullRequest
1 голос
/ 05 марта 2020

У меня есть данные опроса, над которыми я работаю в 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 так, как я хочу, то я был бы признателен за это. Спасибо!

Ответы [ 3 ]

5 голосов
/ 05 марта 2020

Суть в том, что вы хотите больше поворачивать, очищать его, а затем расширять, используя ранги в качестве имен столбцов, а не вариантов. Этот метод похож на 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

Создано в 2020-03-04 Представить пакет (v0.3.0)

5 голосов
/ 05 марта 2020

Мы можем преобразовать в «длинный» формат и затем повернуть его в «широкий» формат

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) 
1 голос
/ 05 марта 2020

Для интереса, однострочник в базе R, который производит правильный порядок:

gsub("Choice", "", t(apply(data_new, 1, function(x) names(data_new)[-1][order(x[-1])]))[,1:5])
#>   [,1] [,2] [,3] [,4] [,5]
#> 1 "C"  "B"  "F"  "E"  "A" 
#> 2 "F"  "E"  "C"  "B"  "D" 
#> 3 "B"  "D"  "A"  "E"  "F" 
#> 4 "D"  "C"  "E"  "F"  "B" 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...