gpt4 book ai didi

sas - 如何使用数组对变量进行水平排序以及使用 call sortc

转载 作者:行者123 更新时间:2023-12-02 15:20:06 27 4
gpt4 key购买 nike

sasprofessionals.net 上的用户遇到了一个问题,即无法按多个变量对其数据集进行分组,其中变量值在观察中可以互换,因为它们具有相同的含义。

在示例数据集中,观测值 2,3 和 7 是相同的,因为它们每个都有 A14、A14 和 A10 作为 Stat1 到 Stat3 的值,只是顺序不同。这些应该按计数分组。观察 5 和 6 构成另一组,应通过计数进行总结。

示例数据集:

Obs Stat1 Stat2 Stat3 Count
1 A14 A14 A14 53090
2 A14 A14 A10 6744
3 A14 A10 A14 5916
4 A01 A01 A01 4222
5 A10 A10 A10 3085
6 A10 A10 A10 2731
7 A10 A14 A14 2399

期望的输出:

Obs Stat1 Stat2 Stat3 Count
1 A14 A14 A14 53090
4 A01 A01 A01 4222
6 A10 A10 A10 5816
7 A10 A14 A14 15059

实际数据集更大、更复杂。不知道用户是否尝试过任何方法来解决问题。

这个问题最初发布在 sasprofessionals.net 上,为了社区的利益,它被复制到 StackOverflow。已进行更改以满足 StackOverflow 问答标准。

最佳答案

这是我解决用户问题的答案。一般来说,我将 Stat1-Stat3 加载到一个数组中,使用 sortc 调用函数对数组进行排序,然后通过由排序的 Stat1-Stat3 数组构造的临时 ID 将其求和。

/* Loading the data into SAS dataset */ 
/* Loading Stat1-Stat3 into an array */
/* Sorting stat1-stat3 creating a new ID */
data have;
input obs stat1 $ stat2 $ stat3 $ count;
array stat{3} stat1-stat3;
call sortc(of stat1-stat3);
ID = CATX("/",stat1,stat2,stat3);
datalines;
1 A14 A14 A14 53090
2 A14 A14 A10 6744
3 A14 A10 A14 5916
4 A01 A01 A01 4222
5 A10 A10 A10 3085
6 A10 A10 A10 2731
7 A10 A14 A14 2399
;


/* sorting the data set in preparation for data step with by statement*/
PROC SORT data=have;
BY ID OBS;
RUN;

/* Summarising the dataset and outputing into final dataset*/
DATA summed (drop=ID count);
set sorted_arrays;
by ID;
retain sum 0;
if first.ID then sum = 0;
sum + count;
if last.ID then output;
RUN;

/* Sorting it back into original order */
PROC SORT data=summed out=want;
BY OBS;
RUN;

关于sas - 如何使用数组对变量进行水平排序以及使用 call sortc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30350093/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com