Search code examples
spss

Systematically renaming variables in SPSS (without Python)


I'm looking for a solution to rename variables in SPSS. I can't use Python because of software restrictions at my workplace.

The goal is to rename variables into "oldname_new". I tried "do repeat" like this, but it can't be combined with the rename function.

do repeat x= var1 to var100.
rename var (x=concat("x","_new")).
end repeat print. 
exe.

Also, I figured that even without the do repeat, the rename command doesn't allow concat and similar commands? Is that correct?

So, is there any solution for this in SPSS?


Solution

  • As you found out you can't use rename within a do repeat loop.
    SPSS macro can do this -

    define DoNewnames ()
    rename vars 
    !do !v=1 !to 100 !concat("var", !v, " = var", !v, "_new") !doend .
    !enddefine.
    
    * now the macro is defined, we can run it.
    DoNewnames .
    

    EDIT: The code above is good for a set of variables with systematic names. In case the names are not systematic, you will need a different macro:

    define DoNewnames (varlist=!cmdend)
    rename vars 
    !do !v !in(!varlist) !concat(!v, " = ", !v, "_new") !doend .
    !enddefine.
    
    * Now in this case you need to feed the variable list into the macro.
    DoNewnames varlist = age sex thisvar thatvar othervar. 
    

    If you want to see the syntax generated by the macro (like you did with end repeat print) you can run this before running the macro:

    set mprint on.
    

    EDIT 2: As the OP says - the last macro requires naming all the variables to be renamed, which is a hassle if there are many. So the next code will get them all automatically without naming them individually. The process - as described in @petit_dejeuner's comment - creates a new data set that contains each original variable as an observation, and the original variable name as a value (=meta information about the variables, like a codebook). This way, you can recode the variable name into the renaming syntax.

    dataset name orig.
    DATASET DECLARE  varnames.
    OMS /SELECT TABLES /IF COMMANDS=['File Information'] SUBTYPES=['Variable Information'] 
        /DESTINATION FORMAT=SAV OUTFILE='varnames' VIEWER=NO.
    display dictionary.
    omsend.
    dataset activate varnames.
    string cmd (a50).
    compute cmd=concat("rename vars ", rtrim(var1), " = ",  rtrim(var1), "_new .").
    * Before creating the rename syntax in the following line, this is your chance to remove variables from the list which you do not wish to rename (using "select if" etc' on VAR1).    
    write out="my rename syntax.sps" /cmd.
    dataset activate orig.
    insert file="my rename syntax.sps" .
    

    A couple of notes:

    1. Before writing to (and inserting from) "my rename syntax.sps" you may need to add a writable path in the file name.
    2. This code will rename ALL the variable in the dataset. If you want to avoid some of the variables - you should filter them in the variable list before writing out to "my rename syntax.sps" (see where I point this out in the code).