- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi guys,
how can I write in "if, then" statement: if a condition = x then columnx = wordC1 wordC2 wordC3 wordC4 wordC5 wordC6 in a compact way? Let say:
> if condition = 0 then columnx = wordC1-wordC6
Edit:
suppose to have the following:
> ID
> 6
> 6
> 6
> 2
> 2
> 2
> 2
> 1
> 1
Desired output:
> out
> wordC1
> wordC2
> wordC3
> wordP1
> wordP2
> wordP3
> wordP4
> wordF1
> wordF2
> if ID = 6 then wordC* (from 1 to 3 because there are 3 rows having 6 in ID column)
> if ID = 3 then wordP* (from 1 to 4 because there are 4 rows having 2 in ID column)
> if ID = 1 then wordF* (from 1 to 2 because there are 2 rows having 1 in ID column)
Thank you in advance
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
You can use a format (or similar) to store the mapping from ID= 1, 2,6 to C,P, F.
Since your data are grouped by ID , you can use by-group processing to count records in each group.
So I think something like below should work, if I'm understanding what you want:
data have ;
input id ;
cards ;
6
6
6
2
2
2
2
1
1
;
run ;
proc format ;
value type
6='C'
2='P'
1='F'
;
run ;
data want ;
set have ;
by id notsorted ;
if first.id then _count=0 ;
_count++1 ;
word=cats("word",put(id,type.),_count) ;
drop _count ;
run ;
proc print data=want ;
run ;
Returns:
Obs id word 1 6 wordC1 2 6 wordC2 3 6 wordC3 4 2 wordP1 5 2 wordP2 6 2 wordP3 7 2 wordP4 8 1 wordF1 9 1 wordF2
Next webinar will be in January 2025. Until then, check out our archives: https://www.basug.org/videos. And be sure to subscribe to our our email list.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
How do you want the words to be concatenated? Blanks, underlines, hyphens, nothing in between?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Something like this?
data _null_;
length column1 $256.;
input var1 $ var2 $ var3 $ var4 $ var5 $ var6 $;
if 1 then column1 = catx(" ", of var1-var6);
put column1=;
cards;
word1
word2
word3
word4
word5
word6
;
run;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Where do the C P and F come from? There is no obvious reason to insert those characters. Is there another rule you haven't mentioned.
I suggest you provide an actual example of your data set as I think there may be more than one or two things missing in your description. The data should be in the form of a working data step.
Instructions here: https://communities.sas.com/t5/SAS-Communities-Library/How-to-create-a-data-step-version-of-your-dat... will show how to turn an existing SAS data set into data step code that can be pasted into a forum code box using the </> icon or attached as text to show exactly what you have and that we can test code against.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
You can use a format (or similar) to store the mapping from ID= 1, 2,6 to C,P, F.
Since your data are grouped by ID , you can use by-group processing to count records in each group.
So I think something like below should work, if I'm understanding what you want:
data have ;
input id ;
cards ;
6
6
6
2
2
2
2
1
1
;
run ;
proc format ;
value type
6='C'
2='P'
1='F'
;
run ;
data want ;
set have ;
by id notsorted ;
if first.id then _count=0 ;
_count++1 ;
word=cats("word",put(id,type.),_count) ;
drop _count ;
run ;
proc print data=want ;
run ;
Returns:
Obs id word 1 6 wordC1 2 6 wordC2 3 6 wordC3 4 2 wordP1 5 2 wordP2 6 2 wordP3 7 2 wordP4 8 1 wordF1 9 1 wordF2
Next webinar will be in January 2025. Until then, check out our archives: https://www.basug.org/videos. And be sure to subscribe to our our email list.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
@NewUsrStat wrote:
Unfortunately they come from other calculations. I cannot change them. I have to use C, P and F.
If they are calculated then you should share the calculation as that is needed as part of the solution of your question.