Hello All,
I am stumped on what is not working here. My goal is to code the LBCFent variable as positive if either Fental or Norfentanyl are positive (=1). The output for the Proc Freq is good for both Fentnyl and Norfentanyl but the LBCFent is completely empty. Any suggestions?
data LBCFin4;
set LBCFin3;
length LBCFent $50.;
format LBCFent $50.;
Fentanyl =strip(Fentanyl);
Norfentanyl=strip(Norfentanyl);
Oxycodone = strip(Oxycodone);
Oxymorphone= strip(Oxymorphone);
if Fentanyl =1 or Norfentanyl =1 then LBCFent = "Pos";
run;
proc freq data=LBCFin4; tables Fentanyl Norfentanyl ; run;
This is different data than you showed in reply #4 or reply #7. No wonder the code provided doesn't work. It is also very confusingly named, so that variable Fentanyl can have values Fentanyl or norfentanyl. But anyway, you never had numbers 0 or 1, you have character strings formatted to zero or one, and to do any type of logic where you test if a variable is equal to a value, you don't test if is equal to the formatted value (because that won't work), you test if it is equal to the unformatted value.
Anyway, with this data, here is some code that will work
data have;
length mrn $16;
input MRN $ Fentanyl :$16. Norfentanyl :$16. ;
datalines;
123 Fentanyl Positive
123 Norfentanyl Positive
123 Oxy Negative
234 Fentanyl Negative
234 Norfentanyl Negative
234 Oxy Positive
345 Fentanyl Positive
345 Norfentanyl Negative
345 Oxy Positive
456 Fentanyl Negative
456 Norfentanyl Negative
456 Oxy Positive
567 Fentanyl Positive
567 Norfentanyl Positive
567 Oxy Positive
679 Fentanyl Negative
679 Norfentanyl Positive
679 Oxy Negative
678 Fentanyl Negative
678 Norfentanyl Positive
678 Oxy Negative
789 Fentanyl Positive
789 Norfentanyl Positive
789 Oxy Negative
890 Fentanyl Negative
890 Norfentanyl Positive
890 Oxy Positive
134 Fentanyl Negative
134 Norfentanyl Negative
134 Oxy Negative
245 Fentanyl Positive
245 Norfentanyl Positive
245 Oxy Negative
356 Fentanyl Negative
356 Norfentanyl Negative
356 Oxy Negative
467 Fentanyl Negative
467 Norfentanyl Positive
467 Oxy Positive
578 Fentanyl Negative
578 Norfentanyl Negative
578 Oxy Negative
690 Fentanyl Positive
690 Norfentanyl Positive
690 Oxy Negative
321 Fentanyl Negative
321 Norfentanyl Negative
321 Oxy Negative
;
proc sort data=have;
by mrn;
run;
data want;
merge have(where=(fentanyl='Fentanyl') rename=(norfentanyl=posneg1))
have(where=(fentanyl='Norfentanyl') rename=(norfentanyl=posneg2));
by mrn;
if posneg1='Positive' or posneg2='Positive' then lgcfen='Pos';
run;
You don't say whether your variables are character or numeric ... but its reasonable to guess that they are character, in which case you need
if Fentanyl ='1' or Norfentanyl ='1' then LBCFent = "Pos";
Either that or your variables fentanyl and norfentanyl are never equal to one, did you check that?
Hi Paige,
Yes the variables are character. Yes I did check the spreadsheet and all variables are coded 0 or 1.
Thanks!
Susan
Please post some example data, so we have something to test code against. Use a data step with datalines.
HI there. Sample variables and code in SAS Window.
Fentanyl Norfentanyl MRN
1 1 123
1 0 234
0 0 345
0 0 456
1 1 567
1 0 678
1 1 789
1 0 890
0 0 910
0 0 321
1 1 432
1 1 543
1 1 654
1 0 765
1 1 876
1 0 987
0 0 990
PLEASE POST EXAMPLE DATA IN A DATA STEP WITH DATALINES.
Otherwise we have no idea about variable types and other attributes like lengths, formats involved, etc.
Help us to help you.
data LabConf;
input Fentanyl $ Norfentanyl $ MRN;
datalines;
1 0 123
1 1 234
1 1 345
0 0 456
0 1 567
1 1 678
0 1 789
1 0 890
1 1 910
0 0 321
1 0 432
0 1 543
1 1 654
0 1 765
0 0 876
0 0 987
;
run;
Then you should also use string literals in your condition:
if strip(Fentanyl) = "1" or strip(Norfentanyl) = "1" then LBCFent = "Pos";
or convert everything to numbers:
if input(Fentanyl,best.) = 1 or input(Norfentanyl,best.) = 1 then LBCFent = "Pos";
If that still does not give you the expected results, please post the log of your code.
Hi Kurt,
It did not work. The proc freq output show 1's for Fentanyl and Norfentanyl but the "Pos" is not there for LBCFent. Any thoughts?
LOG:
74 data LBCFin4;
75 set LBCFin3;
76 length LBCFent $50.;
77 format LBCFent $50.;
78 if strip(Fentanyl) = "1" or strip(Norfentanyl) = "1" then
78 ! LBCFent = 'Pos';
79 run;
NOTE: There were 191 observations read from the data set WORK.LBCFIN3.
NOTE: The data set WORK.LBCFIN4 has 191 observations and 22 variables.
NOTE: Compressing data set WORK.LBCFIN4 increased size by 100.00
percent.
Compressed is 2 pages; un-compressed would require 1 pages.
NOTE: DATA statement used (Total process time):
real time 0.02 seconds
cpu time 0.00 seconds
80 proc freq data=LBCFin4; tables Fentanyl Norfentanyl LBCFent ; run
80 ! ;
NOTE: There were 191 observations read from the data set WORK.LBCFIN4.
NOTE: PROCEDURE FREQ used (Total process time):
real time 0.04 seconds
cpu time 0.03 seconds
It WORKS.
Proof:
data have;
input Fentanyl $ Norfentanyl $ MRN;
datalines;
1 0 123
1 1 234
1 1 345
0 0 456
0 1 567
1 1 678
0 1 789
1 0 890
1 1 910
0 0 321
1 0 432
0 1 543
1 1 654
0 1 765
0 0 876
0 0 987
;
data want;
set have;
length LBCFent $50.;
format LBCFent $50.;
if strip(Fentanyl) = "1" or strip(Norfentanyl) = "1" then LBCFent = 'Pos';
run;
proc print data=want noobs;
run;
Result:
Fentanyl Norfentanyl MRN LBCFent 1 0 123 Pos 1 1 234 Pos 1 1 345 Pos 0 0 456 0 1 567 Pos 1 1 678 Pos 0 1 789 Pos 1 0 890 Pos 1 1 910 Pos 0 0 321 1 0 432 Pos 0 1 543 Pos 1 1 654 Pos 0 1 765 Pos 0 0 876 0 0 987
Good Morning Kurt!
Thank you so much but my code is still not working. I have attached some sample data and my code up
and including that point. It makes no sense to me why it is not working.
Any insight or suggestions are appreciated! Thanks! Susan
data have;
input MRN $ Fentanyl $ Norfentanyl ;
datalines;
123 Fentanyl Positive
123 Norfentanyl Positive
123 Oxy Negative
234 Fentanyl Negative
234 Norfentanyl Negative
234 Oxy Positive
345 Fentanyl Positive
345 Norfentanyl Negative
345 Oxy Positive
456 Fentanyl Negative
456 Norfentanyl Negative
456 Oxy Positive
567 Fentanyl Positive
567 Norfentanyl Positive
567 Oxy Positive
679 Fentanyl Negative
679 Norfentanyl Positive
679 Oxy Negative
678 Fentanyl Negative
678 Norfentanyl Positive
678 Oxy Negative
789 Fentanyl Positive
789 Norfentanyl Positive
789 Oxy Negative
890 Fentanyl Negative
890 Norfentanyl Positive
890 Oxy Positive
134 Fentanyl Negative
134 Norfentanyl Negative
134 Oxy Negative
245 Fentanyl Positive
245 Norfentanyl Positive
245 Oxy Negative
356 Fentanyl Negative
356 Norfentanyl Negative
356 Oxy Negative
467 Fentanyl Negative
467 Norfentanyl Positive
467 Oxy Positive
578 Fentanyl Negative
578 Norfentanyl Negative
578 Oxy Negative
690 Fentanyl Positive
690 Norfentanyl Positive
690 Oxy Negative
321 Fentanyl Negative
321 Norfentanyl Negative
321 Oxy Negative
;
Data LBCFin;
set work.LB1;
run;
* Create SAS Dataset from Excel File;
OPTIONS COMPRESS = YES;
options ls=70 ps=50 mergenoby=error;
proc format ;
value $RESULT_VAL 'Positive' = '1'
'Negative' = '0';
run;
data LBCFin1;
set LBCFin;
format RESULT_VAL $RESULT_VAL.;
run;
* Printout;
proc print data = LBCFin1; run;
* Transpose Wide Steps;
proc sort tagsort data = LBCFin1;
by ALIAS2 CE_EVENT_DISP DRAWN_DT_TM;
run;
proc transpose data = LBCFin1 out = LBConFin;
by ALIAS2 CE_EVENT_DISP DRAWN_DT_TM;
var RESULT_VAL;
run;
proc sort tagsort data = LBConFin; * ADDED THIS EXTRA PROC SORT, IT WORKED;
by ALIAS2 DRAWN_DT_TM;
run;
proc transpose data = LBConFin delimiter=_ out=LBCFin3 (drop=_name_);
by ALIAS2 DRAWN_DT_TM;
var col1;
id CE_EVENT_DISP;
run;
proc print data=LBCFin3 (obs=200); run;
proc contents data=LBCFin4; run;
proc freq data=LBCFin4; tables Fentanyl Norfentanyl LBCFent LBCNorfent ; run;
/******************* Changing drug class variables*************/;
/* Fix using variable names*/;
data LBCFin4;
set LBCFin3;
length LBCFent $50.;
format LBCFent $50.;
if strip(Fentanyl) = "1" or strip(Norfentanyl) = "1" then LBCFent = 'Pos';
run;
This is different data than you showed in reply #4 or reply #7. No wonder the code provided doesn't work. It is also very confusingly named, so that variable Fentanyl can have values Fentanyl or norfentanyl. But anyway, you never had numbers 0 or 1, you have character strings formatted to zero or one, and to do any type of logic where you test if a variable is equal to a value, you don't test if is equal to the formatted value (because that won't work), you test if it is equal to the unformatted value.
Anyway, with this data, here is some code that will work
data have;
length mrn $16;
input MRN $ Fentanyl :$16. Norfentanyl :$16. ;
datalines;
123 Fentanyl Positive
123 Norfentanyl Positive
123 Oxy Negative
234 Fentanyl Negative
234 Norfentanyl Negative
234 Oxy Positive
345 Fentanyl Positive
345 Norfentanyl Negative
345 Oxy Positive
456 Fentanyl Negative
456 Norfentanyl Negative
456 Oxy Positive
567 Fentanyl Positive
567 Norfentanyl Positive
567 Oxy Positive
679 Fentanyl Negative
679 Norfentanyl Positive
679 Oxy Negative
678 Fentanyl Negative
678 Norfentanyl Positive
678 Oxy Negative
789 Fentanyl Positive
789 Norfentanyl Positive
789 Oxy Negative
890 Fentanyl Negative
890 Norfentanyl Positive
890 Oxy Positive
134 Fentanyl Negative
134 Norfentanyl Negative
134 Oxy Negative
245 Fentanyl Positive
245 Norfentanyl Positive
245 Oxy Negative
356 Fentanyl Negative
356 Norfentanyl Negative
356 Oxy Negative
467 Fentanyl Negative
467 Norfentanyl Positive
467 Oxy Positive
578 Fentanyl Negative
578 Norfentanyl Negative
578 Oxy Negative
690 Fentanyl Positive
690 Norfentanyl Positive
690 Oxy Negative
321 Fentanyl Negative
321 Norfentanyl Negative
321 Oxy Negative
;
proc sort data=have;
by mrn;
run;
data want;
merge have(where=(fentanyl='Fentanyl') rename=(norfentanyl=posneg1))
have(where=(fentanyl='Norfentanyl') rename=(norfentanyl=posneg2));
by mrn;
if posneg1='Positive' or posneg2='Positive' then lgcfen='Pos';
run;
I can only say: Maxim 3
Know Your Data includes assigned formats.
And comparisons always use the raw values, not the formatted ones.
It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.