【发布时间】:2019-08-22 01:34:16
【问题描述】:
messy 是一个 SAS 字符变量,其中包含作者在自己的工作中引用的论文列表。
这是对messy 的一项观察。
(label:1;name:Azad, Meghan B;pubyear:2008;volume:4;issue:2;pagenum:195;refwork:Autophagy;collkey:2008051953)(label:2;name:Bai, Jing;pubyear:2012;volume:39;issue:3;pagenum:2697;refwork:Mol Biol Rep;collkey:2012197491)
此记录包括 2 个引用 - 一个以 "(label:1;" 开头,另一个以 "(label:2;" 开头。
我需要为每个引用创建在“名称:”之后返回部分内容的字符变量。对于这个观察,它看起来像这样:
clean1 clean2
AZAD.MEGHAN BAI.JING
我尝试在数据步骤中使用scan() 函数执行此操作,如下所示:
data ex2;
length lastname1-lastname10
lastname1-lastname10
clean1-clean10 $100; /*initializes empty variables for storing up to 10 names*/
set ex;
array lastname {*} lastname1-lastname10;
array firstname {*} firsttname1-firstname10;
array clean {*} clean1-clean10;
do i=1 to count(messy, "label:"); /*loop through messy as many times as there are names*/
lastname{i} = scan(messy, 1, "name:"); /*pick up first word after name*/
firstname{i} = scan(messy, 2, "name:"); /*pick up second word after name*/
clean{i} = cats(upcase(lastname{i}), ".", upcase(firstname{i}));
end;
run;
这里有(至少)两个问题:
- 我的循环不会选择观察中的第 n 个名称;它将继续将
scan()的结果(“name:”第一次出现后的内容)写入lastname和firstname数组中的变量。 - 我显然误解了
scan()本身的工作原理!我认为第三个参数允许我指定我选择的分隔符,但scan(messy, 1, "name:");的结果返回"(l"而不是"AZAD",正如我所料。
具体问题:
如何获取messy 变量中的所有名称并将它们分别存储为clean1、clean2 等?
【问题讨论】:
-
SCAN()的第三个参数允许提供 set 的分隔符,使用name:不会像您预期的那样查找'name:',它寻找'n','a','m','e' OR ':'
标签: arrays string sas data-manipulation data-cleaning