Pyrite | Level 9

## Translating a SAS/IML list definition into a position

Continuing the conversation re: representing an IML list structure as a matrix, how do I determine the position of the item L3_4 in the following example:

``````proc iml ; package load ListUtil ;
L = [ #'L1'=[ #'L1_1' = [ #'L1_2' = 'item L1_2' ] ]
, #'L2'=[ #'L2_1' = 'item L2_1']
, #'L3'=[ #'L3_1 '= [ #'L3_2' = [ #'L3_3' = [ #'L3_4'= 'item L3_4' ] ] ] ]
] ;
call struct(L) ;
call listprint( L ) ;
quit ;
``````

If I want to delete item L\$'L3'\$'L3_1'\$'L3_2'\$'L3_3'\$'L3_4', how do I use ListDeleteItem() to do this? How do I represent the position as a numeric matrix of indices or a character matrix of item names? Is my confusion due to the fact that I am trying to delete an item from a sublist? If so, how do I delete an item from a sublist?

1 ACCEPTED SOLUTION

Accepted Solutions
SAS Super FREQ

## Re: Translating a SAS/IML list definition into a position

Yes, I think your confusion is because you are trying to directly delete from a sublist. You can't use ListDeleteItem for that. The easiest way to delete an item from a sublist is to use ListGetSubItem with the 'd' flag:

``````proc iml ; package load ListUtil ;
L = [ #'L1'=[ #'L1_1' = [ #'L1_2' = 'item L1_2' ] ] ];
call struct(L) ;

item = ListGetSubItem(L, {'L1' 'L1_1' 'L1_2'}, 'd' );  /* get value; delete from the list */
free item;  /* optional: completely delete the item */
call struct(L) ;``````
SAS Super FREQ

## Re: Translating a SAS/IML list definition into a position

Yes, I think your confusion is because you are trying to directly delete from a sublist. You can't use ListDeleteItem for that. The easiest way to delete an item from a sublist is to use ListGetSubItem with the 'd' flag:

``````proc iml ; package load ListUtil ;
L = [ #'L1'=[ #'L1_1' = [ #'L1_2' = 'item L1_2' ] ] ];
call struct(L) ;

item = ListGetSubItem(L, {'L1' 'L1_1' 'L1_2'}, 'd' );  /* get value; delete from the list */
free item;  /* optional: completely delete the item */
call struct(L) ;``````
From The DO Loop