I have a simple data table in SAS, where I have the results from a survey I sent to my friends:
DATA Questionnaire;
INPUT make $ Question_Score ;
CARDS;
Ned 1
Shadowmoon 2
Heisenberg 1
Athelstan 4
Arnold 5
;
RUN;
What I want to do, using SAS, is to export this table into SPSS (.sav), and also have the value labels for the Question_Score, like shown in the picture below:
I then proceed to create a format in SAS (in hope this would do it):
PROC FORMAT;
VALUE Question_Score_frmt
1="Totally Agree"
2="Agree"
3="Neutral"
4="Disagree"
5="Totally Disagree"
;
run;
PROC FREQ DATA=Questionnaire;
FORMAT Question_Score Question_Score_frmt.
;
TABLES Question_Score;
RUN;
and finally export the table to a .sav file using the fmtlib option:
proc export data=Questionnaire outfile="D:\Questionnaire.sav"
dbms=spss replace;
fmtlib=work.Q1frmt;
quit;
Only to disappoint myself seeing that it didn't work.
Any ideas on how to do this?
You didn't apply the format to the dataset, unfortunately, you applied it to the proc freq. You would need to use PROC DATASETS or a data step to apply it to the dataset.
proc datasets lib=work;
modify questionnaire;
format Question_Score Question_Score_frmt.;
run;
quit;
Then exporting will include the format, if it's compatible in SAS's opinion with SPSS's value label rules. I will note that SAS's understanding of SPSS's rules is quite old, based on I think SPSS version 9, and so it's fairly often that it won't work still, unfortunately.
Related
I have a table in sas format (.sas7bdat) and would like to output it in Jupyter notebook.
proc print data=dataBoxE.my_data (firstobs=2 obs=12);
run;
The output table is jammed together since it has 100+ columns. How should I setup the environment within my notebook?
Moreover, is there a way to save the log file instead of opening it right away in the output cell? Thanks.
In SAS you can change the location of where the log file is created using proc printto; Documentation here.
When using proc printto, don't forget to reset the location to the default system value at the end of your, Example:
proc printto log='c:\em\log1.log';
run;
/* Your code here */
proc printto;
run;
If you don't need the 100+ columns; then select only the ones you want using the VAR statement in proc print Documentation here :
proc print data=exprev;
var country price sale_type;
run;
If you want all the 100+; just export them to csv using proc export and view them in any spreadsheet reader to avoid crashing your browser. Documentation here.
proc export data=sashelp.class
outfile='c:\myfiles\Femalelist.csv'
dbms=csv
replace;
run;
I am using SAS Enterprise Guide, importing American Community Survey tables from the census into a script to work with them. Here is an example of a raw census csv I'm importing into SAS Enterprise Guide:
within my data step, when I use the command
County=Geo.display-label;
I get this error:
In base SAS, I was using
County=Geo_display_label;
While that worked in base SAS, when I tried that in Enterprise Guide, I got this error:
What is a way to get the raw data's variable name Geo.display-label to read into SAS Enterprise Guide correctly?
To see the impact of the VALIDVARNAME option on the names that PROC IMPORT generates when the column headers are not valid SAS names lets make a little test CSV file.
filename csv temp ;
data _null_;
file csv ;
put 'GEO.id,GEO.id2,GEO.display-label';
put 'id1,id2,geography';
run;
If we run PROC IMPORT to convert that into a SAS datasets when VALIDVARNAME option is set to ANY then it will use the column headers exactly, including the illegal characters like period and hyphen. To reference the variables with those illegal characters we will need to use name literals.
options validvarname=any;
proc import datafile=csv replace out=test1 dbms=dlm;
delimiter=',';
run;
proc contents data=test1; run;
proc freq data=test1;
tables 'GEO.display-label'n ;
run;
But if we set the option to V7 instead then it will convert the illegal characters into underscores.
options validvarname=v7;
proc import datafile=csv replace out=test2 dbms=dlm;
delimiter=',';
run;
proc contents data=test2; run;
proc freq data=test2;
tables geo_display_label ;
run;
County = 'geo.display-label'n;
if you set OPTIONS VALIDVARNAME=V7; in EG you will get the same names as batch sas.
I have a sas7bdat table that contains format information but I do not have the formats, so lots of the data appears as * and doesn't make much sense. I know the informat data that lies beneath is there — how can I remove all formats from the table?
There is another way in addition to #JustinDavies's answer that is to use PROC DATASETS procedure.
Adapted from the SAS documentation: Example 1: Removing All Labels and Formats in a Data Set
proc datasets lib=<your library> memtype=data nolist;
modify <your dataset>;
attrib _all_ label=' ';
attrib _all_ format=;
attrib _all_ informat=;
run;
The advantage in using PROC DATASETS is that it modifies the dataset's metadata in-place - i.e., it is not going to create a new dataset as suggested in the other answer to this question. That feature could be of advantage if your dataset is large.
The following code will strip all formatting from the table FORMATTED_TABLE and create a new table named UNFORMATTED_TABLE
data UNFORMATTED_TABLE;
set FORMATTED_TABLE;
format _all_;
run;
Relatively new to SAS and I'm using proc import on an SPSS (.sav) data file and it runs fine but I noticed that it brings in only the SPSS value labels rather than the numeric equivalent. As an example in the Gender column 1='male', 2='female' and in the SAS data set 'male' and 'female' show up rather than 1 or 2.
Any insight would be appreciated. Current code...
proc import datafile = "C:\Data\workload_20130314.sav"
out=library.workload_20130314
dbms = sav
replace;
run;
You probably have the underlying values there, they're probably just formatted. Try opening the dataset and viewing the column properties of one of the columns you're looking at; it probably has a format that's like Q49F. or something that does that. It still works with PROC MEANS or whatever as a numeric variable.
You can run, I think, something like
proc datasets;
modify my_dataset;
format _all_;
quit;
to remove the overlay. You can also do that on a case by case basis.
ods html file = "Y:/cars/cars.xls";
proc sql;
title "Cars";
select
make,model,type,origin,drivetrain
from sashelp.class
where engine size gt 3;
quit;
Suppose after run above query in SAS I will get output in excel format.
So, how it is possible to get same ouput via proc report step?
You wouldn't get much output from that since there aren't any cars in sashelp.class.
The basic proc report step will look something like:
title "Cars";
proc report data=sashelp.cars nowd;
where enginesize gt 3;
columns make model type origin drivetrain;
run;
I wouldn't use PROC REPORT though just to do this - the point of PROC REPORT is all of the other features you can use, between the formatting options, the summarization options, etc.