根据sas中另一个字符变量的值来重新编码字符变量中的值

时间:2019-03-28 15:39:49

标签: string sas recode

jrnlfile是带有日记名称和标识符的数据集。这是前6个Obs:

id      journal                         issn
56201   ACTA HAEMATOLOGICA              0001-5792
94365   ACTA PHARMACOLOGICA SINICA  
10334   ACTA PHARMACOLOGICA SINICA      1671-4083
55123   ADVANCES IN ENZYME REGULATION   0065-2571
90002   AGING   
10403   AGING                           1945-4589

比较id 94365和10334。这些obs命名相同的journal。他们需要相同的issn。 {em>几乎总是缺少issn值的obs至少有一个伙伴obs,其中包含匹配的journal名称和正确的issn。无论在哪里,我都想重新编码丢失的issn,以便它包含在提到相同issn的其他实例中看到的journal。修改后的数据集want如下所示:

id      journal                         issn
56201   ACTA HAEMATOLOGICA              0001-5792
94365   ACTA PHARMACOLOGICA SINICA      1671-4083
10334   ACTA PHARMACOLOGICA SINICA      1671-4083
55123   ADVANCES IN ENZYME REGULATION   0065-2571
90002   AGING                           1945-4589
10403   AGING                           1945-4589

我目前在数据步骤中使用if-else语句,以issn的匹配条目填充丢失的journal值:

data want;
    set jrnlfile;
         if journal = "ACTA PHARMACOLOGICA SINICA" then issn = "1671-4083";
    else if journal = "AGING"                      then issn = "1945-4589";
    /*continue for 7,000 other journals*/
    run;

但是jrnlfile包含50,000 obs和7,000种独特日记本,因此这会花费很多时间,并且容易出错。 This answer可以让我走到一半,但是issn并不是数字形式,我无法通过简单地添加值来解决问题。

wantjrnlfile的更有效和系统的方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用保留声明。但是此代码有一些限制。要清空日记帐,将设置第一个找到的issn。并且日记组必须有一个或多个isn。

proc sort data=JRNLFILE;
    by journal descending issn;
run;

data want;
    set  JRNLFILE;
    retain t_issn;
    by journal descending issn;

    if first.journal then
        do;
            if issn="" then do;
                put "ERROR: there is no issn val for group";
                stop;
            end;
            else t_issn =issn;
        end;

    if issn="" then
        do;
            issn=t_issn;
        end;
run;

例如。如果您使用此表:

+-------+------------------------------+-----------+
|  id   |           journal            |    issn   |
+-------+------------------------------+-----------+
| 94365 | ACTA PHARMACOLOGICA SINICA   |           |
| 10334 | ACTA PHARMACOLOGICA SINICA   | 1671-4083 |
|     1 | ACTA PHARMACOLOGICA SINICA   | A_TEST    |
|     2 | ACTA PHARMACOLOGICA SINICA   | WAS       |
|     3 | ACTA PHARMACOLOGICA SINICA   | SATRTED   |
+-------+------------------------------+-----------+

您将获得:

+-------+----------------------------+-----------+--------+
|  id   |          journal           |   issn    | t_issn |
+-------+----------------------------+-----------+--------+
|     2 | ACTA PHARMACOLOGICA SINICA | WAS       | WAS    |
|     3 | ACTA PHARMACOLOGICA SINICA | SATRTED   | WAS    |
|     1 | ACTA PHARMACOLOGICA SINICA | A_TEST    | WAS    |
| 10334 | ACTA PHARMACOLOGICA SINICA | 1671-4083 | WAS    |
| 94365 | ACTA PHARMACOLOGICA SINICA | WAS       | WAS    |
+-------+----------------------------+-----------+--------+

错误示例。 如果您使用此表:

+-------+------------------------------+-----------+
|  id   |           journal            |    issn   |
+-------+------------------------------+-----------+
| 56201 | ACTA HAEMATOLOGICA           | 0001-5792 |
| 94365 | ACTA PHARMACOLOGICA SINICA   |           |
+-------+------------------------------+-----------+

您将收到一个错误:

  

错误:组没有issn值

* t_issn不能理解功能:))

答案 1 :(得分:1)

如果数据按Journal排序,并且有效值首先出现,则可以进行简单的UPDATE。但是请注意是否还有其他变量缺少值。

data want;
  update have(obs=0) have ;
  by journal;
  output;
run;

您可以尝试将数据与ISSN的非缺失值合并。这仅要求数据按Journal排序。如果仅存在一个唯一的非缺失值,则将非常有效。如果存在多个非缺失值,那么结果将不太理想。

data want ;
   merge have have(where=(not missing(issn)) keep=journal issn rename=(issn=_2));
   by journal;
   if missing(issn) then issn=_2;
   drop _2;
run;