sas - 根据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
返回标签的逻辑是:
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)
解决方案
这看起来像一个简单的格式应用程序。因此,定义一种将 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;
如果数据发生变化,您不需要重新创建格式,仅当可能值列表发生变化时。
推荐阅读
- python - Flask-Admin中使用SQLAlchemy的hybrid_property总和表达式的排序顺序不稳定
- reactjs - 淡出过渡不适用于 React Bootstrap Alert 组件
- c++ - 我可以使用套接字连接从任何 IP 地址而不是特定 IP 地址获取连接吗?
- php - 在 MySQL 中存储以小数表示的年龄数字
- python - 数据框与条件重复?
- react-native - 即使在通过 transformIgnorePatterns 编译后,Jest 测试在 react-native-screens 上也失败了
- android-studio - 我可以在Android Studio 3.6 中自定义“代码、拆分、设计”的图标吗?
- c++ - 从向量中选择多个字符串并将其传递给第二个向量以显示?
- c# - 调整列大小未正确刷新
- google-cloud-platform - Snowflake 连接到澳大利亚的 Google Cloud Storage