Csv 如何从SAS数据集中消除重复条目?
有一个以CSV格式提供给我的示例数据集。 虚拟数据集如下所示:Csv 如何从SAS数据集中消除重复条目?,csv,sas,Csv,Sas,有一个以CSV格式提供给我的示例数据集。 虚拟数据集如下所示: Baseball1,Baseball2 USA,France USA,Italy USA,England England,USA England,Australia England,Sri Lanka France,USA France,England France,Italy Italy,USA Italy,France Italy,England 我需要得到一个输出数据,其中的数据只有descrete值。 所需输出如下: Ba
Baseball1,Baseball2
USA,France
USA,Italy
USA,England
England,USA
England,Australia
England,Sri Lanka
France,USA
France,England
France,Italy
Italy,USA
Italy,France
Italy,England
我需要得到一个输出数据,其中的数据只有descrete值。
所需输出如下:
Baseball1 Baseball2
USA France
USA Italy
USA England
England Australia
England Sri Lanka
France England
France Italy
Italy England
我认为PROC-SQL可能在这里工作,但我不确定如何删除不同列的重复条目。我认为棘手的部分是您关心变量的水平顺序,因此对于您来说,法国/意大利和意大利/法国实际上形成了一个要删除的重复条目 请参见下面的我的代码及其功能说明:
/* Reading data in */
data have;
length baseball1 $ 9 baseball2 $ 9;
infile datalines delimiter=',';
input Baseball1 $ Baseball2 $ ;
datalines;
USA,France
USA,Italy
USA,England
England,USA
England,Australia
England,Sri Lanka
France,USA
France,England
France,Italy
Italy,USA
Italy,France
Italy,England
;
/* horizontal sorting */
data sorted_arrays;
set have;
length Team1 $ 9 Team2 $ 9;
/* Copying data into new vars to preserve original data for output */
Team1 = Baseball1;
Team2 = Baseball2;
/* Sorting data horizontally with sortc call */
call sortc(Team1,Team2);
/* Creating an ID by concatenating sorted variables */
ID = (CATX("/",Team1,Team2));
/* Preserving original order */
order = _N_;
run;
/* Removing duplicates by ID and keeping required variables*/
PROC SORT data=sorted_arrays out=no_dupes(keep=baseball1 baseball2 order) NODUPKEY;
BY ID;
RUN;
/* Returning to original order to achieve the result needed */
PROC SORT data=no_dupes out=want(drop=order);
by order;
run;
/* Final Report*/
PROC PRINT data=want;
RUN;
结果:
如果变量的最终水平/垂直顺序无关紧要,您可以按如下方式简化代码,并可以使用PROC SQL:
/* Reading data in */
data have;
length baseball1 $ 9 baseball2 $ 9;
infile datalines delimiter=',';
input Baseball1 $ Baseball2 $ ;
/* horizontal sorting */
call sortc(Baseball1,Baseball2);
datalines;
USA,France
USA,Italy
USA,England
England,USA
England,Australia
England,Sri Lanka
France,USA
France,England
France,Italy
Italy,USA
Italy,France
Italy,England
;
/*Remove dupes */
PROC SQL;
CREATE TABLE want AS
SELECT DISTINCT t1.baseball1,
t1.baseball2
FROM WORK.HAVE t1;
QUIT;
/* Final Report*/
PROC PRINT data=want;
RUN;
结果:
与前一示例中的结果相同:
我对订单一点也不关心。它可以是法国、美国或美国、法国。任何人都可以参加。感谢您在问题中添加了所需的数据集,该数据集在水平和垂直方向上都保留了顺序。如果您不关心顺序,代码仍然可以为您工作。您可以通过删除一半id来简化它。我将修改我的答案以显示我的意思。如果我不想使用CALL Sortc函数怎么办?如果您不想使用
CALL Sortc
,您可以始终构建自己的水平排序逻辑。标准的“大于”比较也适用于字符串。然后可以在proc sql
中执行水平排序。我可以问一下,到底是什么阻止了您实现sortc
?我想了解一下“sortc”背后的基本原理。你可以说我只是想知道@Vasilijnevlevesting问题!
/* Reading data in */
data have (drop=tmp);
length baseball1 $ 9 baseball2 $ 9 tmp $9;
infile datalines delimiter=',';
input Baseball1 $ Baseball2 $;
/* horizontal sorting */
if Baseball1>Baseball2 then
do;
tmp = Baseball1;
Baseball1=Baseball2;
Baseball2 = tmp;
end;
datalines;
USA,France
USA,Italy
USA,England
England,USA
England,Australia
England,Sri Lanka
France,USA
France,England
France,Italy
Italy,USA
Italy,France
Italy,England
;
/*Remove dupes */
PROC SQL;
CREATE TABLE want AS
SELECT DISTINCT t1.baseball1,
t1.baseball2
FROM WORK.HAVE t1;
QUIT;
/* Final Report*/
PROC PRINT data=want;
RUN;