有关如何最好地管理此数据集的建议?
Advice on how best to manage this dataset?
SAS 新手,希望就如何最好地处理这种数据管理情况提供建议和帮助。
我有一个数据集,其中每个观察代表一个客户。每个客户都有一个 "description" 变量,其中可能包括综合评估、治疗或出院。我创建了 3 个新变量来标记每个观察结果(如果它们包含其中之一)。
例如:
treat_yes = 1 如果描述包含 "tx"、"treatment"
dc_yes = 1 如果描述包含 "dc"、"d/c" 或 "discharge"
ca_yes = 1 如果描述包含 "comprehensive assessment" 或 "ca" 或 "comprehensive ax"
我的最终目标是获得经过综合评估、治疗和出院的客户的新数据集。
对于我的下一步应该是什么,我有点难过。我为客户标记了所有变量。但是可能会有重复的观察,因为客户可能来过很多次。例如:
Client_id treatment_yes ca_yes dc_yes
1234 0 1 1
1234 1 0 0
1234 1 0 1
我真正关心的是对于特定客户,变量 treatment_yes、ca_yes 和 dc_yes 是否不等于 0(即,它们每个至少有一个“1 ”。它们可以有多个“1”,但只要它们至少被标记一次即可。
我在想我的下一步可能是折叠每个唯一客户端 ID 的数据(你是怎么做到的?)和 treatment_yes、dc_yes 和 ca_yes 的总和每个客户。
这有用吗?
如果是这样,我该怎么做?我从哪里开始?
谢谢大家!
我认为此时最简单的事情是使用 proc sql 步骤来查找三个变量中每一个的最大值,按 client_id:
data temp;
input Client_id $ treatment_yes ca_yes dc_yes;
datalines;
1234 0 1 1
1234 1 0 0
1234 1 0 1
;
run;
proc sql;
create table temp_collapse as select distinct
client_id, max(treatment_yes) as treatment_yes,
max(ca_yes) as ca_yes, max(dc_yes) as dc_yes
from temp
group by client_id;
quit;
更好的整体方法是使用您用来创建 _yes 变量的数据集并执行类似 max(case when desc = "tx" then 1 else 0 end) as treatment_yes
等的操作,但由于您对 SAS 仍然是新手并且了解您所做的事情到目前为止,我认为上述方法完全足够了。
以下代码允许您保留原始数据集中的其他变量。为了便于说明,我添加了两个变量(var1 和 var2):
data temp;
input Client_id $ treatment_yes ca_yes dc_yes var1 var2 $;
datalines;
1234 0 1 1 10 A
1234 1 0 0 11 B
1234 1 0 1 12 C
;
run;
将数据集与自身合并,以便原始数据集中 client_id 的每一行与子查询中构造的聚合数据集中的相应行合并。
proc sql;
create table want as
select *
from temp as a
left join (select client_id,
max(treatment_yes) as max_treat,
max(ca_yes) as max_ca,
max(dc_yes) as max_dc
from temp
group by client_id) as b
on a.client_id=b.client_id;
quit;
SAS 新手,希望就如何最好地处理这种数据管理情况提供建议和帮助。
我有一个数据集,其中每个观察代表一个客户。每个客户都有一个 "description" 变量,其中可能包括综合评估、治疗或出院。我创建了 3 个新变量来标记每个观察结果(如果它们包含其中之一)。
例如:
treat_yes = 1 如果描述包含 "tx"、"treatment" dc_yes = 1 如果描述包含 "dc"、"d/c" 或 "discharge" ca_yes = 1 如果描述包含 "comprehensive assessment" 或 "ca" 或 "comprehensive ax"
我的最终目标是获得经过综合评估、治疗和出院的客户的新数据集。
对于我的下一步应该是什么,我有点难过。我为客户标记了所有变量。但是可能会有重复的观察,因为客户可能来过很多次。例如:
Client_id treatment_yes ca_yes dc_yes
1234 0 1 1
1234 1 0 0
1234 1 0 1
我真正关心的是对于特定客户,变量 treatment_yes、ca_yes 和 dc_yes 是否不等于 0(即,它们每个至少有一个“1 ”。它们可以有多个“1”,但只要它们至少被标记一次即可。
我在想我的下一步可能是折叠每个唯一客户端 ID 的数据(你是怎么做到的?)和 treatment_yes、dc_yes 和 ca_yes 的总和每个客户。
这有用吗?
如果是这样,我该怎么做?我从哪里开始?
谢谢大家!
我认为此时最简单的事情是使用 proc sql 步骤来查找三个变量中每一个的最大值,按 client_id:
data temp;
input Client_id $ treatment_yes ca_yes dc_yes;
datalines;
1234 0 1 1
1234 1 0 0
1234 1 0 1
;
run;
proc sql;
create table temp_collapse as select distinct
client_id, max(treatment_yes) as treatment_yes,
max(ca_yes) as ca_yes, max(dc_yes) as dc_yes
from temp
group by client_id;
quit;
更好的整体方法是使用您用来创建 _yes 变量的数据集并执行类似 max(case when desc = "tx" then 1 else 0 end) as treatment_yes
等的操作,但由于您对 SAS 仍然是新手并且了解您所做的事情到目前为止,我认为上述方法完全足够了。
以下代码允许您保留原始数据集中的其他变量。为了便于说明,我添加了两个变量(var1 和 var2):
data temp;
input Client_id $ treatment_yes ca_yes dc_yes var1 var2 $;
datalines;
1234 0 1 1 10 A
1234 1 0 0 11 B
1234 1 0 1 12 C
;
run;
将数据集与自身合并,以便原始数据集中 client_id 的每一行与子查询中构造的聚合数据集中的相应行合并。
proc sql;
create table want as
select *
from temp as a
left join (select client_id,
max(treatment_yes) as max_treat,
max(ca_yes) as max_ca,
max(dc_yes) as max_dc
from temp
group by client_id) as b
on a.client_id=b.client_id;
quit;