1
votes

Nettoyage des données d'enquête de choix de rang dans R

J'ai des données d'enquête sur lesquelles je travaille dans R qui comprend des questions où les répondants ont reçu une liste d'options et ont été invités à classer leurs cinq premiers. Les données ressemblent à ceci:

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                        

Je voudrais les remodeler pour qu'elles ressemblent à ceci:

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      

Qu'est-ce qu'un moyen efficace de le faire, de préférence en tidyverse? J'ai l'impression que la réponse va impliquer de modifier les valeurs d'une nouvelle colonne en fonction des noms d'autres colonnes, ce que je ne sais pas comment faire.

Je récupère également ces données de SurveyGizmo, donc si quelqu'un a des suggestions pour un moyen de le configurer afin que les données soient exportées vers un csv comme je le souhaite en premier lieu, je l'apprécierais également. Merci!


0 commentaires

3 Réponses :


5
votes

Nous pouvons le remodeler au format «long», puis le faire pivoter au format «large»

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) 


0 commentaires

6
votes

L'essentiel est que vous voulez pivoter plus longtemps, nettoyer un peu, puis pivoter plus large en utilisant les rangs comme noms de colonnes au lieu des choix. C'est une méthode similaire à akrun, même si je pense que compte tenu de la limite de cinq choix de codage en dur des noms de colonne ordinale est moins complexe. a href = "https://reprex.tidyverse.org" rel = "noreferrer"> package reprex (v0.3.0)


2 commentaires

J'ai réussi à faire fonctionner ça, merci! Avez-vous des suggestions pour reproduire cela sur d'autres questions? Cela fonctionne très bien pour une seule question d'enquête, mais j'ai une enquête complète sur ces questions de choix de rang, et cette solution semble un peu compliquée à écrire dans une fonction.


Cela dépend de la façon dont les autres questions diffèrent ... en nombre d'options à choisir? aucun changement nécessaire. en nombre de choix sélectionnés? vous devrez créer une sorte de paramètre "n_choice". Ou voulez-vous dire comment pouvez-vous appliquer cela à de nombreuses questions?



1
votes

Par intérêt, un one-liner en base R qui produit le bon ordre:

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" 


0 commentaires