SAS:按ID分组并对ID变量中的条件数求和
SAS: Grouping by ID and summing the number of a condition in a variable for the ID
我有一个数据集,其中包含 ID 和一个名为 CC 的变量。 CC 包含多个编号值,其中每个值代表某物。它看起来像这样:
一个 ID 可以在多行中具有相同的 CC,我只想标记 CC 是否存在,所以即使 Joe 有五行说明他的 CC 等于 3 我只想要 1 或 0 说明如果乔的 CC 等于 3。
我希望它看起来像这样:
我尝试按如下所示对其进行编码,但问题是,尽管我知道一个 ID 可以有不止一种类型的 CC,但根据代码创建的最终数据集只显示每个填充的 ID 有 1 个 CC。我想也许它正在覆盖它?
另外我应该注意,在此代码之前,我创建了 CC Flag 变量并将其全部填充为零。
proc sql;
DROP TABLE Flagged_CCs;
CREATE TABLE Flagged_CCs AS
select
ID,
COUNT(ID) as count_ID,
case when CC=1 then 1 end as CC_1,
case when CC=2 then 1 end as CC_2,
case when CC=3 then 1 end as CC_3
from Original_Dataset
group by ID;
quit;
感谢任何帮助,谢谢。
您的问题是在 运行 您的新代码之后每个 ID 仍然有多行吗?
如果是这样我建议:
proc sql;
DROP TABLE Flagged_CCs;
CREATE TABLE Flagged_CCs AS
select ID
,case when CC_1 >0 then 1 else 0 end as CC_1
,case when CC_2 >0 then 1 else 0 end as CC_2
,case when CC_3 >0 then 1 else 0 end as CC_3
from (
select
ID,
COUNT(ID) as count_ID,
sum(case when CC=1 then 1 end) as CC_1,
sum(case when CC=2 then 1 end) as CC_2,
sum(case when CC=3 then 1 end) as CC_3
from Original_Dataset
group by ID
);
quit;
您遇到问题的原因是您只聚合了 ID 的计数而不是其他值,对它们使用聚合将消除重复记录。
希望对您有所帮助
如果您要查找报告,这里有一种方法,使用 PROC TABULATE。
proc format ;
value indicator_fmt
low - 0, . = 0
0 - high = 1;
run;
proc tabulate data=have;
class id cc;
table id , cc*N=''*f=indicator_fmt.;
run;
您的输出将如下所示:
如果您想在 table 中使用完全动态的方法,您不需要提前知道任何信息,例如 CC 的数量,这是一种不同的方法。它有点长,但动态部分使其可能值得实施。
我有一个数据集,其中包含 ID 和一个名为 CC 的变量。 CC 包含多个编号值,其中每个值代表某物。它看起来像这样:
一个 ID 可以在多行中具有相同的 CC,我只想标记 CC 是否存在,所以即使 Joe 有五行说明他的 CC 等于 3 我只想要 1 或 0 说明如果乔的 CC 等于 3。
我希望它看起来像这样:
我尝试按如下所示对其进行编码,但问题是,尽管我知道一个 ID 可以有不止一种类型的 CC,但根据代码创建的最终数据集只显示每个填充的 ID 有 1 个 CC。我想也许它正在覆盖它? 另外我应该注意,在此代码之前,我创建了 CC Flag 变量并将其全部填充为零。
proc sql;
DROP TABLE Flagged_CCs;
CREATE TABLE Flagged_CCs AS
select
ID,
COUNT(ID) as count_ID,
case when CC=1 then 1 end as CC_1,
case when CC=2 then 1 end as CC_2,
case when CC=3 then 1 end as CC_3
from Original_Dataset
group by ID;
quit;
感谢任何帮助,谢谢。
您的问题是在 运行 您的新代码之后每个 ID 仍然有多行吗?
如果是这样我建议:
proc sql;
DROP TABLE Flagged_CCs;
CREATE TABLE Flagged_CCs AS
select ID
,case when CC_1 >0 then 1 else 0 end as CC_1
,case when CC_2 >0 then 1 else 0 end as CC_2
,case when CC_3 >0 then 1 else 0 end as CC_3
from (
select
ID,
COUNT(ID) as count_ID,
sum(case when CC=1 then 1 end) as CC_1,
sum(case when CC=2 then 1 end) as CC_2,
sum(case when CC=3 then 1 end) as CC_3
from Original_Dataset
group by ID
);
quit;
您遇到问题的原因是您只聚合了 ID 的计数而不是其他值,对它们使用聚合将消除重复记录。
希望对您有所帮助
如果您要查找报告,这里有一种方法,使用 PROC TABULATE。
proc format ;
value indicator_fmt
low - 0, . = 0
0 - high = 1;
run;
proc tabulate data=have;
class id cc;
table id , cc*N=''*f=indicator_fmt.;
run;
您的输出将如下所示:
如果您想在 table 中使用完全动态的方法,您不需要提前知道任何信息,例如 CC 的数量,这是一种不同的方法。它有点长,但动态部分使其可能值得实施。