2016-07-23 2 views
0

Existe-t-il un moyen plus simple dans les packages de haven ou étiquetés de transformer les variables étiquetées en variables numériques?coercition des variables étiquetées à numérique après recodage

Le code suivant illustre mon problème. Après important à partir d'un fichier sav, chaque variable est une variable étiquetée. Certains sont, à l'origine, des variables numériques, 98 et 99 étant des valeurs manquantes. Donc, je dois recoder ceux à mettre à NA, mais alors je dois contraindre la variable recodée à numérique avec as.numeric()

Y at-il une façon plus simple de le faire?

#Load libraries 
library(devtools) 
library(dplyr) 
library(car) 
#Install package with data 
install_github('sjkiss/LSIRM') 
#Load library 
library(LSIRM) 
#Loda dataset 
data(ces) 
#show variable of interest 
table(ces$PES15_74) 
#Get variable labels 
variable_labels<-lapply(ces, function(x) attr(x, 'label')) 
#Get value labels 
value_labels<-lapply(ces, function(x) attr(x, 'labels')) 
#Show class of variable of interest 
class(ces$PES15_74) 
#show variable and value labels 
ces$PES15_74 
attr(ces$PES15_74, 'labels') #Note 98 and 99 should be missing values 
#Show mean 
mean(ces$PES15_74, na.rm=T) 
#Recode out missing values 
ces$tv<-recode(ces$PES15_74, "98:99=NA") 
#Show class 
class(ces$tv) 
#Try with as.factor.result=F 
ces$tv2<-recode(ces$PES15_74, "98:99=NA", as.factor.result=F) 
#show class 
class(ces$tv2) 
#coerce to numeric 
ces$tv<-as.numeric(ces$tv) 
#show mean after coercion 
mean(ces$tv, na.rm=T) 
#show mean uncoerced 
mean(ces$PES15_74, na.rm=T) 
+0

Si vous avez des variables numériques régulières, vous pouvez facilement changer 98 et 99 en NA. Pourquoi ne pas simplement convertir les colonnes nécessaires en numérique, puis s'inquiéter des nombres particuliers après que tout soit réglé? –

+1

puisque vous dites que vous devez contraindre à numérique, je suppose que 'ces $ PES15_74' est un personnage? alors vous pouvez essayer 'type.convert (c (1: 5, '98', '99'), na.strings = c ('98 ',' 99 '))' – rawr

Répondre

0

Vous pouvez essayer mon package expss. Mais il a une implémentation légèrement différente de la classe "étiqueté" donc il y a une conversion dans le code ci-dessous (ou vous pouvez lire le fichier * .sav avec expss :: read_spss).

library(LSIRM) 
data(ces) 
library(expss) 

### change class "labelled" to c("labelled", "numeric") 
for (each in colnames(ces)){ 
    if ("labelled" %in% class(ces[[each]])){ 
     class(ces[[each]]) = c("labelled", "numeric") 
    } 
} 

### calculations 
fre(ces$PES15_74) 
ces$tv = if_val(ces$PES15_74, 98:99 ~ NA) 
fre(ces$tv) 
cro(ces$PES15_74, ces$tv) 
mean_col(ces$tv)