【问题标题】:add a new column based on other columns in sas根据sas中的其他列添加新列
【发布时间】:2020-10-31 10:51:12
【问题描述】:

我是 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)

【问题讨论】:

  • 您只有两个类别还是需要将其扩展到更多类别和组?即只有食物/颜色?
  • 我建议创建格式,然后使用这些格式创建所需的变量。红色和苹果的标签是 A、A 还是 A?
  • 为什么你用一个字母标记一些记录,而用两个字母标记一些记录?为什么不总是一个字母代表食物类型,另一个字母代表颜色类型?
  • 您介意多解释一下如何创建格式吗?我认为红色和苹果的标签应该是 A,因为两列都符合 A 的标准(或者你认为 A,A)会更容易实现吗?

标签: sas proc-sql


【解决方案1】:

这看起来像是一个简单的格式应用程序。因此,定义一种将 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;

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

【讨论】:

  • 只是补充一下,如果您最终需要摘要作为最终结果,您可以执行以下操作。 proc freq data=have; table food*color; format food $food. color $color.; 您确实需要这些格式,但您不需要在数据集中创建这种组合。
猜你喜欢
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多