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

标签 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 命名相同的期刊。他们需要相同的issnissn 缺失值的 obs 几乎总是至少有一个合作伙伴 obs,其中包含匹配的期刊名称和正确的 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 语句,用 journal 的匹配条目填充缺失的 issn 值:

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 不是数字,我无法通过简单地向其添加值来解决问题。

jrnlfile 获取 want 的更有效、更系统的方法是什么?

最佳答案

您可以使用保留语句。但这段代码有一些限制。清空日志将被设置为第一个找到的 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   |           |
+-------+------------------------------+-----------+

你会得到一个错误:

ERROR: there is no issn val for group

*t_issn 留下来理解函数:))

关于string - 根据 sas 中另一个字符变量的值重新编码字符变量中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401629/

相关文章:

java - 替换子字符串的优雅解决方案

sql - SAS SQL 中带有条件语句的子查询

c# - 找出有多少字符串匹配

string - 如何从 Rust 中的字符串开头删除 "crop"个字符?

c# - ASP.NET C#中日期和字符串的转换

recode - 重新编码连续变量

r - 如何在 dplyr 中使用 recode_factor 来重新编码多个因子值?

csv - 从 CSV 文件更新本地 SAS 表

installation - 从闪存驱动器运行 SAS 9.4

R:使用 recode、mutate 和 case_when 重新编码变量