Wenn man Skalen hat und aus irgendwelchen Gründen was nicht angegeben wurde zerhaut es dir die Skala, wichtiger aber noch, damit man überhaupt sieht, dass es weggefallen ist. In meinem Fall merge ich mehrere Datensätze aus verschiedenen Städten bzw. Ländern zusammen. Die sind alle leider nicht so groß geworden, wie wir gehofft hatten, da das Thema die Leute nicht so gerockt hat. Insofern kann es durchaus mal vorkommen, dass in einzelnen Datensätzen Fälle fehlen. Dann brauchten wir auch noch landesspezifische Anpassungen, wo es extrem unschön wäre wenn die einfach ungesehen wegfallen.
Um das Problem zu umgehen, habe ich die Syntax/den Python Code unterhalb geschrieben. Falls jemand das gleiche Problem hat und gerne die Limesurvey Werte Convertiert haben möchte kann einfach das hier unten in die Syntax kopiert werden. Wichtig dabei ist zu beachten, das ganze ist für die Default Werte in den Limesurvey Baterrien ausgelegt. Wenn ihr da irgendwelchen Fancy-Kram reingeschrieben habt (A32Lime9 z.B.), funktioniert es eventuell nicht. Dann wirklich besser autorecode verwenden.
Der Code erhät euch eure existierenden Wertelabels und passt euch diese auch für nicht existierende Werte an. Wenn ihr Werte ohne Wertelabel habt, kann das Programm damit ebenfalls umgehen - diese werden sofern sie eine Zahl enthalten einfach in diese Zahl umgewandelt, erhalten aber kein (neues) Wertelabel. Die Antwort "andere Antwort" bekommt standardmäßig den Wert -9 und das label "other anwer".
Im Code unten habe die Konversion in den Variablentyp "numeric" noch ausgeschaltet. Checkt bitte, dass auch wirklich alle Antworten konvertiert wurden, bevor ihr dies macht. Eventuell deckt mein Code einen Sonderfall bei euch nicht mit ab.
- Code: Alles auswählen
BEGIN PROGRAM PYTHON3.
import spss, spssaux, re, spssdata
print("Warning: This program is meant for recoding limesurvey default item batteries to a numeric format.\
Eventual customisations may not be covered by this code. Please make sure to check the results for errors.\
By default variables remain in string format and need to be manually converted")
sDict = spssaux.VariableDict() #Get a copy of the Variable Dictionary (can't be directly changed!)
infotext = "Variables processed: " # begin infotext
#Iterate through all variables (in the dictionary - all variables in this case)
for var in sDict:
#Only Adress variables which are of type String and have value labels.
if spss.GetVariableType(var.index) > 0 and var.ValueLabels != {} :
varname = spss.GetVariableName(var.index) #Get variable Name
infotext += varname + ', ' #Add processed variable to infotext
#Begin Value Labels and Recode commands for active variable
commandlab = 'Value Labels ' + varname + ' '
commandrecode = 'Recode ' + varname + ' '
commandalter = 'Alter Type ' + varname + '(f2).'
#Get unique values of Variable
varvalues = set(spssdata.Spssdata(varname, names=False).fetchall())
varvalues = set([item[0] for item in varvalues])
#Write the recode code for the variable
for item in varvalues:
if any(char.isdigit() for char in item): #make sure only values containing digits are processed
newkey = re.findall(r'\d+', item)[0] #Get first number in key (value of label)
newkey = re.sub(r'0+(.+)', r'\1', newkey) #Cut leading zeros from number
#Add entry to recode command
commandrecode = commandrecode + '("' + item + '"="' + newkey + '") '
if "-" in item: #in case "other" answer
newkey = "-9" #set value for "other" answer
#Add entry for Value labels and recode commands
commandrecode = commandrecode + '("' + item + '"="' + newkey + '") '
commandlab = commandlab + newkey + ' ' + '"' + 'Other answer' + '"' + ' '
#Open entry for each value of valuelabels
for key,val in var.ValueLabels.items():
newkey = re.findall(r'\d+', key)[0] #Get first number in key (value of label)
newkey = re.sub(r'0+(.+)', r'\1', newkey) #Cut leading zeros from number
#Add entry Value labels command:
commandlab = commandlab + newkey + ' ' + '"' + val + '"' + ' '
#Complete commands for SPSS:
commandlab = commandlab + '.'
commandrecode = commandrecode + '.\n Execute.'
#Check codes
#print(commandlab) #Syntax for labeling
#print(commandrecode) #Syntax for recoding
#print(varvalues) #Unique values for variable
#Execute recode and relabel (and alter type).
spss.Submit(commandlab) #relabel
spss.Submit(commandrecode) #recode
#spss.Submit(commandalter) #alter type to numeric
#Show frequencies of altered variables to look for errors
spss.Submit("frequencies " + varname)
#Print Infos
print(infotext)
print("Warning: Only Values containing numbers have been recoded.\
Please check your dataset to make sure all entries have been affected.")
end program.