【问题标题】:recode values in a character variable based on another character variable's value in sas根据 sas 中另一个字符变量的值重新编码字符变量中的值
【发布时间】:2019-03-28 15:39:49
【问题描述】:

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。他们需要相同的issnissn 缺失值的 obs 几乎总是 至少有一个伙伴 obs 包含匹配的 journal 名称和正确的 issn。无论这是真的,我想重新编码丢失的issn,以便它包含在其他提到相同journal 的情况下看到的issn。修改后的数据集 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 不是数字,我无法通过简单地向它添加值来解决问题。

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

【问题讨论】:

  • 您能否按期刊对数据集进行排序,使您想用于 ISSN 的值在该期刊的第一次观察中? by journal descending issn;

标签: string sas recode


【解决方案1】:

您可以使用保留语句。但是这个代码有一些限制。清空日志将设置第一个找到的 issn。并且期刊组必须有一个或多个 issn。

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 val

*t_issn 留待了解功能:))

【讨论】:

    【解决方案2】:

    如果数据按 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;
    

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多