2017-07-13 2 views
1

J'essaie de standardiser une colonne de données Age (c'est-à-dire en années/mois) en utilisant SPSS/SPSS Syntax/Excel. Mon intuition est d'utiliser une série de DO IF boucles-à-dire:Standardisation de données d'âge hétérogènes dans SPSS ou Excel

DO IF CHAR.INDEX(Age, "y")>1... for years 
DO IF CHAR.INDEX(Age, "m")>1... for months 
DO IF CHAR.INDEX(Age, "d")>1... for days 

et que le programme de référence le numéro (s) précédant immédiatement la chaîne comme une quantité d'années/mois/jour et l'ajouter à un total de une nouvelle variable qui pourrait être en jours (la plus petite unité) qui pourrait ensuite être convertie en années.

Par exemple pour une cellule "3 ans 5 mois": ajouter 3 * 365 + 5 * 30.5 = 1248 jours à une nouvelle variable (quelque chose comme "DaysOld").

Exemples de contenu de la cellule (numéros sans toutes les chaînes supposées être des années):

2  
5 months  
11 days  
1.7  
13 yr  
22 yrs  
13 months  
10 mo  
6/19/2016  
3y10m  
10m  
12y  
3.5 years  
3 years  
11 mos  
1 year 10 months  
1 year, two months  
20 Y  
13 y/o  
3 years in 2014 

Répondre

0

La syntaxe suivante va résoudre beaucoup de cas, mais certainement pas tous (par exemple « 1.7 » ou ". 3 ans en 2014 "). Vous aurez besoin de faire plus de travail, mais cela, vous devriez obtenir commencé bien ...

D'abord, je recrée vos données d'échantillons de travailler avec:

data list list/age (a30). 
begin data 
"2" 
"5 months" 
"11 days" 
"1.7" 
"13 yr" 
"22 yrs" 
"13 Months" 
"10 mo" 
"6/19/2016" 
"3y10m" 
"10m" 
"12y" 
"3.5 years" 
"3 YEARS" 
"11 mos" 
"1 year 10 months" 
"1 year, two months" 
"20 Y" 
"13 y/o" 
"3 years in 2014" 
end data. 

Au travail:

* some necessary definitions. 

string ageCleaned (a30) chr (a1) nm d m y (a5). 
compute ageCleaned="". 

* my first step is to create a "cleaned" age variable (it's possible to 
    manage without this variable but using this is better for debugging and 
    improving the method). 
* in the `ageCleaned` variable I only keep digits, periods (for decimal 
    point) and the characters "d", "m", "y". 

do if CHAR.INDEX(lower(age),'ymd',1)>0. 
loop #chrN=1 to char.length(age). 
    compute chr=lower(char.substr(age,#chrN,1)). 
    if CHAR.INDEX(chr,'ymd.',1)>0 ageCleaned=concat(rtrim(ageCleaned),chr). 
end loop. 
end if. 

* the following line accounts for the word "days" which in the `ageCleaned` 
    variable has turned into the characters "dy". 

compute ageCleaned=replace(ageCleaned,"dy","d"). 
exe. 

* now I can work through the `ageCleaned` variable, accumulating digits 
    until I meet a character, then assigning the accumulated number to the 
    right variable according to that character ("d", "m" or "y"). 

compute nm="". 
loop #chrN=1 to char.length(ageCleaned). 
    compute chr=char.substr(ageCleaned,#chrN,1). 
    do if CHAR.INDEX(chr,'.',1)>0. 
     compute nm=concat(rtrim(nm),chr). 
    else. 
     if chr="y" y=nm. 
     if chr="m" m=nm. 
     if chr="d" d=nm. 
     compute nm="". 
    end if. 
end loop. 
exe. 

* we now have the numbers in string format, so after turning them into 
    numbers they are ready for use in calculations. 

alter type d m y (f8.2). 
compute DaysOld=sum(365*y, 30.5*m, d). 
+0

Oui cela a fonctionné parfaitement merci beaucoup! Tout ce qui restait était de transférer sur des instances de chiffres seulement, c'est-à-dire "27", ce qui était très facile. Tu m'as sauvé une tonne de temps !! – Rozo