【问题标题】:How to create a column in sas with different combinations row wise?如何在 sas 中按行创建具有不同组合的列?
【发布时间】:2017-09-02 19:19:42
【问题描述】:

我有一个包含 864 行的以下数据集。我想用 SCREEN、BATTERY、RAM、PROCESSOR、HD_SIZE、BUNDLED_APP、Int_Wire 的 128 种不同组合创建一个单独的“组”列。

SCREEN BATTERY RAM  PROCESSOR HD_SIZE Bundled_App Int_Wire
------- ------- ---- --------- ------- ----------- -------- 
SMALL   LOW    LOW    LOW      LOW       Yes       Yes
SMALL   LOW    LOW    LOW      LOW       No        Yes
SMALL   LOW    LOW    LOW      LOW       Yes       Yes
SMALL   LOW    LOW    LOW      LOW       No        Yes
SMALL   LOW    LOW    LOW      LOW       Yes       Yes
SMALL   LOW    LOW    LOW      LOW       No        Yes
SMALL   LOW    LOW    LOW      HIGH      Yes       Yes
SMALL   LOW    LOW    LOW      HIGH      No        Yes
SMALL   LOW    LOW    LOW      LOW       Yes       No
SMALL   LOW    LOW    LOW      LOW       No        No

解决方案数据应如下所示:

SCREEN BATTERY RAM  PROCESSOR HD_SIZE Bundled_App Int_Wire  Group
------- ------- ---- --------- ------- ----------- -------- ------
SMALL   LOW    LOW    LOW      LOW       Yes       Yes     Group 1
SMALL   LOW    LOW    LOW      LOW       No        Yes     Group 120
SMALL   LOW    LOW    LOW      LOW       Yes       Yes     Group 1
SMALL   LOW    LOW    LOW      LOW       No        Yes     Group 120
SMALL   LOW    LOW    LOW      LOW       Yes       Yes     Group 1
SMALL   LOW    LOW    LOW      HIGH      Yes       Yes     Group 2

【问题讨论】:

  • Group 1 和 GROUP 120 背后的逻辑是什么?以后请解释逻辑,不要指望我们弄清楚。如果它回答了您的问题,请在此处查看本教程:stats.idre.ucla.edu/sas/faq/…
  • 当前数据集中大约有 864 行,但我有 128 个独特的行组合。我用excel搞定了。据此,我想在当前数据集中分配 128 个组名。
  • 我应用了此链接中给出的逻辑,但找不到所需的组号。
  • 发布您到目前为止尝试过的代码。如果您正在寻找所有可能的组合并希望对它们进行分组/识别,请查看 CALL ALLCOMB。
  • 您知道这 7 个变量的所有可能值吗?看起来大多数都是二进制的,但它们不是 0/1,而是有些有 No/Yes 其他 LOW/HIGH。您是否希望逻辑为所有可能的组合生成 GROUP?还是只是出现在输入数据中的那些?

标签: sql excel sas proc


【解决方案1】:

这实际上是一个巧妙的问题。我假设您的变量可以采用的值是低和高或者是和否。我从你那里得到了 7 个变量和 2^7 = 128。

要获取您正在寻找的组,请转换您的表格,使所有低和无值都是 0,所有是和高值都是 1。你现在有一个七位数的二进制数。将该二进制数转换回其等效的十进制数,您将得到一个介于 0 到 127 之间的数字。

【讨论】:

  • 好吧,你试过什么? SO 不是免费的编码服务。很高兴能帮助你,但试试看你能想出什么。将您的作品提供为可以轻松复制和粘贴的内容,以便其他人可以使用您的作品。
【解决方案2】:

如果将值编码为 0/1 而不是文本字符串,并且没有缺失值,则可以轻松地将 N 个二进制变量转换为从 0 到 (2**N -1) 的单个数字。

group=input(cats(of var1-var7),binary7.) ;

您可以添加一个以使数字从 1 变为 128,而不是从 0 到 127。

如果您只想查找所有现有组合,那么您可以使用诸如 PROC Summary 之类的东西来查找组合,然后添加一个计数器。或排序并使用 FIRST。处理以添加计数器。

proc sort data=have ;
  by SCREEN BATTERY RAM  PROCESSOR HD_SIZE Bundled_App Int_Wire ;
run;

data groups;
  set have;
  by SCREEN BATTERY RAM  PROCESSOR HD_SIZE Bundled_App Int_Wire ;
  group + first.Int_Wire;
run;

但这只会处理实际出现在数据中的组合。如果您对不同的数据集重复该过程,它可能会将相同的组合分配给不同的组号。

如果您知道每个变量的可能值,您可以生成所有可能组合的数据集。然后要么合并两个数据集,要么生成一个格式并使用它。

data groups;
  if 0 then set have (keep=SCREEN BATTERY RAM  PROCESSOR HD_SIZE Bundled_App Int_Wire);
  do SCREEN='SMALL','LARGE';
  do BATTERY='LOW','HIGH';
  do RAM='LOW','HIGH';
  do PROCESSOR='LOW','HIGH';
  do HD_SIZE='LOW','HIGH';
  do Bundled_App='No','Yes';
  do Int_Wire='No','Yes';
    group +1 ;
    output;
  end;
  end;
  end;
  end;
  end;
  end;
  end;
run;

对于介于这些极端之间的东西,您可以要求 PROC FREQ 生成数据中值的所有可能组合。

proc freq data=have  ;
  tables SCREEN*BATTERY*RAM*PROCESSOR*HD_SIZE*Bundled_App*Int_Wire
       / sparse noprint out=groups 
  ;
run;

data groups;
  set groups ;
  group + 1;
run;

但如果某个值(例如 SCREEN='LARGE')从未出现在数据中,则它不会出现在组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2021-02-18
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2020-05-13
    相关资源
    最近更新 更多