2017-07-31 4 views
0

J'essaie de vérifier plusieurs centaines de variables dans ma trame de données pour déterminer lesquelles contiennent des caractères non ASCII afin de pouvoir convertir un ensemble de données SPSS dans un ensemble de données .dta en utilisant R. L'ensemble de données provient de SPSS (.sav), j'ai utilisé le paquet étranger et read.spss (filename, to.data.frame = TRUE) pour le lire dans R. Maintenant, je voudrais write.dta pour replacer mon dataframe dans stata. Mais je reçois l'erreur:Automatisation d'une vérification des caractères non-ASCII pour une longue liste de variables dans R

In abbreviate(ll, 80L) : abbreviate used with non-ASCII chars

Merci à la réponse de Josh O'Brien au poste suivant: "Removing non-ASCII characters from data files", je suis en mesure d'utiliser son code pour vérifier une variable à la fois pour les caractères non-ASCII.

## Do any lines contain non-ASCII characters? 
any(grepl("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII"))) 
[1] TRUE 

puis de vérifier dans toute variable pour laquelle ceci est TRUE pour l'emplacement des caractères non ASCII.

## Find which lines (e.g. read in by readLines()) contain non-ASCII characters 
grep("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII")) 
[1] 1 2 3 

Est-il possible d'utiliser ces fonctions en R pour vérifier plusieurs s/variables/vecteurs de caractères « x » à la fois et retourner une liste des variables qui contiennent des caractères non-ASCII, ou peut-il être seulement fait avec une boucle? Encore plus pratique serait un moyen de dire simplement à R de convertir tous les caractères non-ASCII dans la base de données en quelque chose qui est compatible avec ASCII afin que je puisse l'écrire en stata. Jusqu'à présent, je peux envisager d'utiliser hadley's answer to the same post referenced above pour convertir chaque variable individuellement en une variable de chaîne compatible avec ascii et l'ajouter à mon ensemble de données, puis supprimer la variable incriminée.

Répondre

0

expansion sur le code de la réponse de Hadley:

library('stringi') 
library('dplyr') 

# simulating an example 
x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher") 

df <- data.frame(id = 1:3, 
       logi = c(T, T, F), 
       test = x, 
       test2 = rev(x), 
       test_norm = c('Everything', 'is', 'perfect')) 
# added several non-character columns to show that they are not affected 
# Now translating every character column to ASCII 

df2 <- df %>% 
    mutate_if(is.character, 
     stri_trans_general, 
     id = "latin-ascii") 

df2 

    id logi    test   test2 test_norm 
1 1 TRUE   Ekstrom bisschen Zurcher Everything 
2 2 TRUE   Joreskog   Joreskog   is 
3 3 FALSE bisschen Zurcher   Ekstrom perfect 

Bien sûr, il ne fonctionnera qu'avec latin en ASCII.

+0

C'est génial et flexible. On peut juste changer l'instruction if en if.integer ou if.factor etc ... pour d'autres types de variables - ce qui, étrangement, beaucoup de mes variables sont stockées comme des entiers même s'ils ont des réponses texte/caractère. L'utilisation de "stri_enc_toascii (x)" au lieu de "stri_trans_general" fonctionne également pour un ensemble plus large de cas. Une étape de plus est de savoir comment utiliser ces données "mutées" pour écraser les anciennes variables. Quand je regarde() mes données, il montre toujours les données non-transformées. Je ne suis pas sûr de savoir comment faire cela, mais peut-être que cela mérite une question distincte. – solnza

+0

@solnza Fait une modification pour assigner new 'data.frame' à' df2'. Avec l'opérateur pipe ('%>%'), l'expression 'x%>% str()' est similaire 'str (x)'. Tout a été expliqué dans 'help ('%>% ')'. 'stri_trans_toascii()' fonctionne un peu différemment de 'stri_trans_general()' alors n'hésitez pas à en choisir un plus approprié. –