Some SPSS commands such as RECODE and ALTER TYPE can make irreversible changes to variables. Before using these, I like to clone the variables that I'm about to edit. This allows me to compare the edited to the original versions.
This tutorial presents a super easy tool for making exact clones of variables in SPSS. We'll use bank-clean.sav (partly shown below) for all examples.
Prerequisites & Installation
Installing this tool requires
- SPSS version 24 or higher with
- the SPSS Python 3 essentials installed.
Recent SPSS versions usually meet these requirements.
Download our tool from SPSS_TUTORIALS_CLONE_VARIABLES.spe. You can install it from as shown below.
After completing these steps, you'll find SPSS tutorials - Clone Variables under Transform.
Clone Variables Example I
Let's first clone jtype -short for job type- as illustrated below.
Completing these steps results in the SPSS syntax below. Let's run it.
SPSS_TUTORIALS_CLONE_VARIABLES VARIABLES=jtype
/OPTIONS FIX="c" FIXTYPE=PREFIX ACTION=RUN.
Result
Note that SPSS has now added a new variable to our data: cjtype as shown below.
Except for its name, cjtype is an exact clone of jtype: it has the same
- variable type and format;
- value labels;
- user missing values;
- and so on...
There's one minor issue with our first example: the syntax we just pasted only runs on SPSS installations with our tool installed.
The solution for this is to have the tool print native syntax instead: this syntax is typically (much) longer but it does run on any SPSS installation. Our second examples illustrates how to do just that.
Clone Variables Example II
Let's create native syntax for cloning a couple of different variables, including a string variable and a date variable.
This option has our tool print native syntax into our output window.
Because we chose to print (rather than run) syntax, this is one of the rare occasions at which we click Ok instead of Paste.
Result
Note that we now have native syntax for cloning several variables in our output window.
For actually running this syntax, we can simply copy-paste-run it in a syntax window.The entire syntax is shown below.
STRING clast_name (A30).
RECODE last_name (ELSE = COPY) INTO clast_name.
APPLY DICTIONARY FROM * /SOURCE VARIABLES = last_name /TARGET VARIABLES = clast_name.
RECODE gender (ELSE = COPY) INTO cgender.
APPLY DICTIONARY FROM * /SOURCE VARIABLES = gender /TARGET VARIABLES = cgender.
RECODE dob (ELSE = COPY) INTO cdob.
APPLY DICTIONARY FROM * /SOURCE VARIABLES = dob /TARGET VARIABLES = cdob.
RECODE educ (ELSE = COPY) INTO ceduc.
APPLY DICTIONARY FROM * /SOURCE VARIABLES = educ /TARGET VARIABLES = ceduc.
If our tool creates very long syntax, you could copy it into a separate file and run it from an INSERT command.
Right, I guess that should cover this simple but handy little tool. Hope you'll give it a try and hope you'll find it helpful. If you've any remarks, feel free to throw me a quick comment below.
Thanks for reading!
THIS TUTORIAL HAS 40 COMMENTS:
By Max on February 2nd, 2016
Hi!
I'd like to run this something like this to clone a set of variables that was defined by the "spssinc select variables" expansion, e.g. on "!var".
What I'd need, basically, is a way to to get a lagged set of those variables, I was thinking about somethig like:
do repeat
A = !var #coming from "select variables"
/B = !var2 #copied set of those variables
B = LAG(A).
end repeat.
Is there any easy way to accomplish that? Thanks a lot!
By Ruben Geert van den Berg on February 2nd, 2016
DO REPEAT seems appropriate here but why are you using the "select variables extension"? It seems to create an SPSS macro variable ("!var") which, IMHO, is pretty worthless.
If the selection of variables is too complex in order to fix things with the TO keyword, I'd personally go for plain Python syntax.
By Max on February 2nd, 2016
Thanks for your reply!
Honstly, I was using the SELECT VARIABLES extension because I thought it would make things easier for me.
I tried simply cloning all variables using the tool and then selecting them with SELECT VARIABLES (e.g. if they have a certain prefix), which seems to work fine. I was then able to adress the original as well as the cloned variables, again using the SELECT VARIABLES extension, to use them for DO REPEAT.
It looks something like this, which seems(!) to work:
SPSSTUTORIALS CLONE VARIABLES VARIABLES="ALL" PREFIX="lag_".
SPSSINC SELECT VARIABLES MACRONAME = "!varsA"
/PROPERTIES PATTERN = "prefix_*".
SPSSINC SELECT VARIABLES MACRONAME = "!varsB"
/PROPERTIES PATTERN = "lag_prefix_*".
DO REPEAT
#B=!varsB.
compute #B=$sysmis.
END REPEAT.
DO REPEAT
#A=!vars
/#B=!varsB.
compute #B=LAG(#A).
END REPEAT.
EXECUTE.
By Ruben Geert van den Berg on February 2nd, 2016
Adressing ALL variables in the active dataset is much easier than some (complex) selection of variables. For simply "lagging" all variables, perhaps try
begin program.
import spss
for ind in range(spss.GetVariableCount()):
varnam = spss.GetVariableName(ind)
spss.Submit('compute %s = lag(%s).'%('lag_' + varnam,varnam))
end program.
execute.
For a different selection, you could throw in one or more Python if statements depending on variable names/labels. For selecting on patterns in value labels, things do get more complicated.
By Max on February 5th, 2016
Thanks again Ruben!
I tried using the code above, but I'm getting an error for COMPUTE. It seems only to be working for numeric Variables, while the DO REPEAT solution doesn't care about the variable type. The solution with constantly cloning variables is really slow, so I'll try to combine a simple python program with DO REPEAT, do you know how to do that?