我根据条件转换了一些数据,现在我想在变量中重复数据。我会在转置数据之前做到这一点,但这样只会给我一个每个变量的例子,我实际上需要某种条件重复数据删除。
我开始使用看起来像这样的数据;
data have;
input ID Event level1 $;
datalines;
12345 9008 Activity1
12345 9008 Activity1
12345 9008 Activity1
12345 9008 Activity1
12345 1001 Activity2
12345 1001 Activity2
12345 1002 Activity3
12345 1002 Activity3
12345 6009 Activity4
12345 9009 Activity1
12345 9008 Activity1
12345 1001 Activity2
23145 9008 Activity1
23145 1001 Activity2
23145 1001 Activity2
23145 1001 Activity2
23145 1002 Activity3
23145 6009 Activity4
23145 1003 Activity5
23145 1003 Activity5
23145 1003 Activity5
23145 1004 Activity6
35762 9008 Activity1
35762 1001 Activity2
35762 1002 Activity3
35762 1002 Activity3
35762 6009 Activity4
35762 6009 Activity4
24958 9008 Activity1
24958 1002 Activity3
24958 1002 Activity3
24958 1002 Activity3
24958 9009 Activity1
24958 9009 Activity2
24958 9009 Activity3
;
run;
此数据根据ID和时间戳(此处未显示)进行分类。我想将其划分为旅程,并根据第一个9008或9009代码转置数据。我通过使用以下代码
成功完成了这项工作data AS.TENMAY_JOUR_TRANS;
set AS.TENMAY_LEVEL1;
if first.EVENT and EVENT = 9008 or EVENT = 9009 then;
proc transpose data=AS.TENMAY_LEVEL1
out=AS.TENMAY_JOUR_TRANS
name=Journey;
by ID;
var level1;
run;
run;
然后给出了这个;
data have;
input ID Journey $ Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 Var11 Var12 Var13;
datalines;
12345 level1 Activity1 Activity1 Activity1 Activity1 Activity2 Activity2 Activity3 Activity3 Activity4
12345 level1 Activity1 Activity1 Activity2
23145 level1 Activity1 Activity2 Activity2 Activity2 Activity3 Activity4 Activity5 Activity5 Activity5 Activity6
35762 level1 Activity1 Activity2 Activity3 Activity3 Activity4 Activity4
24958 level1 Activity1 Activity3 Activity3 Activity3
24958 level1 Activity1 Activity2 Activity3
;
run;
然而我想要达到这一点;
data have ;
input ID Journey $ Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 Var11 Var12 Var13;
datalines;
12345 level1 Activity1 Activity2 Activity3 Activity4
23145 level1 Activity1 Activity2 Activity3 ACtivity4 Activity5 Activity6
35762 level1 Activity1 Activity3 Activity4
24958 level1 Activity1 Activity3
12345 level1 Activity1 Activity2
24958 level1 Activity1 Activity2 Activity3
;
run;
我无法对初始数据进行重复数据删除,因为我需要保留一些重复数据。我只需要在每个ID的第一个新9009或9008之间对level1变量进行重复数据删除
我认为最好的方法是在'PROC SORT'语句中使用'NODUP'或'NODUPKEY'命令,我正在探索像
这样的选项data AS.TENMAY_JOUR_TRANS;
set AS.TENMAY_LEVEL11;
if first.EVENT and EVENT = Activity0 or EVENT = Activity1 then;
proc sort data= AS.TENMAY_JOUR_TRANS NODUP;
proc transpose data=AS2.TENMAY_LEVEL11
out=AS2.TENMAY_JOUR_TRANS
name=Journey;
by ID_INTERNET;
var level1;
run;
run;
run;
我不确定这是最好的方法,如果是这样,基本上我不确定是否在'PROC TRANSPOSE'步骤的内部或外部放置'PROC SORT'步骤。
任何帮助都非常感激。
谢谢!
答案 0 :(得分:1)
我设法通过为每种类型的Activity的每个第一个条目创建一个等于1的标志,然后在我执行第一个Transpose之前基于此进行过滤。这是我使用以下代码
data AS2.TENMAY_LOGFLAG;
set AS2.TENMAY_LEVEL1;
if level1 = 'Activity' then logflag =1;
run;
然后我用EG过滤'where logflag = 1',然后进行Transpose
答案 1 :(得分:0)
在转换数据之前,您应该进行重复数据删除。我们假设你有
data beforehave;
input ID Journey $ Activity $;
datalines;
12345 level1 Activity1
12345 level1 Activity1
12345 level1 Activity1
12345 level1 Activity2
12345 level1 Activity2
23145 level1 Activity1
23145 level1 Activity2
23145 level1 Activity2
;
RUN;
然后你必须在旅程和活动中进行重复数据删除:
PROC SORT data=beforehave; BY journey Activity nodupkey; RUN;
你可以转置。 很抱歉不提供更多代码:我今天无法访问我的SAS ...
答案 2 :(得分:0)
让我们从大问题开始吧。您不能在数据步骤中混合过程。数据步骤基本上是数据集的循环,允许您更改/更改/创建表。一个过程接受一个数据集并用它做一些事情。
所以你要做的是转置数据,删除重复项,然后转换回宽格式。
第1步:转置。
proc sort data=have;
by id journey;
run;
proc transpose data=have out=have_t(where=(col1 ^= "") drop=_name_);
by id journey;
var var:;
run;
这会使您的表格转向,创建一个名为COL1
的列,其中包含所有VAR *变量中的值。 _NAME_
列包含旧列名称。我们不希望如此,所以我们drop
。 where
数据集上的out
会过滤掉未填充的变量。
BY组处理需要排序。
第2步,删除重复。
proc sort data=have_t nodup;
by id journey;
run;
步骤2.5,添加将成为新列名的_NAME_
变量。
data have_t(drop=i);
set have_t;
by id journey;
retain i;
format _name_ $32.;
if first.journey then
i=0;
i = i + 1;
_name_ = "var" || strip(put(i,best.));
run;
在这里,我们创建一个计数变量i
,并在每次旅程中增加计数。将i
变量放在输出中。
第3步,转置回来
proc transpose data=have_t out=want(drop=_name_);
by id journey;
id _name_;
var col1;
run;
非常直接转置,删除新的_name_
变量。
3.5:如果您想要所有13个Var
列。
data want;
format id best. journey $8. var1-var13 $12.;
set want;
run;
这定义了所有列,然后用WANT数据集中的值填充它,覆盖该数据集。