首页 > 解决方案 > 根据sas中的其他列添加新列

问题描述

我是 SAS 新手,想就以下问题获得帮助:

1:样表如下

Time Color Food label
2020 red  Apple A
2019 red Orange A,B
2018 blue Apple A,B
2017 blue  Orange B  
  1. 返回标签的逻辑是:

    when color = 'red' then 'A'
    when color = 'blue' then 'B'
    when food = 'orange' then 'B'
    when food = 'apple' then 'A',
    

因为对于第 2 行,我们既有红色也有橙色,那么我们的标签应该同时包含“A,B”,与第 3 行相同。

要求是打印出每个组合的标签。我知道我们可以使用 CASE WHEN 语句来定义我们的标签应该如何基于颜色和食物。这里我们只有 2 种颜色和 2 种不同的食物,但是如果我们喜欢 7 种不同的颜色和 10 种不同的食物,那么我们会有 7*10 种不同的组合。我不想通过使用 case when 语句来列出所有这些组合。

有什么方便的方法可以退回标签吗?感谢您的任何想法!(更喜欢在 PROC SQL 中实现它,但也欢迎使用 SAS)

标签: sasproc-sql

解决方案


这看起来像一个简单的格式应用程序。因此,定义一种将 COLOR 转换为代码字母的格式和另一种将 FOOD 转换为代码字母的格式。

proc format ;
   value color 'red'='A' 'blue'='B';
   value food 'Apple'='A' 'Orange'='B' ;
run;

然后使用它们将 COLOR 和 FOOD 变量的实际值转换为标签。在数据步骤中:

data want;
   set have ;
   length label $5 ;
   label=catx(',',put(color,color.),put(food,food.));
run;

或 SQL 查询:

proc sql ;
create table want as 
  select *
       , catx(',',put(color,color.),put(food,food.)) as label length=5
  from have
;
run;

如果数据发生变化,您不需要重新创建格式,仅当可能值列表发生变化时。


推荐阅读