Использование сжатия и сканирования в SAS для создания новой переменной - PullRequest
0 голосов
/ 17 октября 2018

Я новичок в SAS и хотел бы сохранить только то, что находится между скобками другого столбца в моем новом столбце, используя сжатие и SCAN:

 x 
abc(animal)
efg(food)
hij(plant)

Я пытался:

DATA NEW 
    set OLD;
    y = (compress(scan([x], 2, '('), ')');
RUN;
PROC PRINT NEW; 
RUN; 

но я не могу заставить его работать.Любое понимание будет полезно.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

@ tom ответ идеален, и другой способ сделать это - использовать prxsubstr.

 data have;
 input x $20.;
 datalines;
abc(animal)
efg(food)
hij(plant)
;

 prxparse \(.+?\) is to find anything between parenthesis
 \( -- starting of parenthesis
 .+?\( ---  anything till closing parenthesis

вызов prxsubstr фиксирует, где он находит образец и его длину.затем выполните substr, чтобы получить значения в скобках

data want;
set have;
if _n_= 1 then do;
retain re;
re = prxparse('/\(.+?\)/');
end;
call prxsubstr(re, trim(x), position, length);

if position gt 0 then 
 new=substr(trim(x),position+1, length-2);
run;
0 голосов
/ 17 октября 2018

Не должно быть необходимости в compress(), если только вы не хотите удалить некоторые другие символы из извлеченного значения.Возможно, вы захотите использовать left() для удаления начальных пробелов из значений, таких как xxx( yyy ).

y=scan(x,2,'()');

Если у вас есть некоторые значения, такие как (no first word), вам может потребоваться использовать индекс 1 вместо двух.Если это так, вы можете использовать =:, чтобы проверить, начинается ли X с открытого символа.

y=scan(x,1+(x^=:'('),'()');

Если вы знаете, что () всегда в конце, вы можете использовать индекс -1.Но опять же, если в некоторых строках есть символы после закрывающей скобки, вам нужно будет использовать -2 вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...