SAS First Dot Variable

时间:2018-04-15 22:30:50

标签: group-by sas

我试图在SAS datastep中使用First Dot自动变量,但它没有产生我正在寻找的输出。我想我可能不理解SAS如何将我的变量与我的声明分组

这是我的代码:

data testing;
input SSN ACCT_num YYMM ID $;
datalines;
123456789   987654321   1801    1
123456789   987654321   1711    9
123456789   476543218   1801    2
123456789   476543218   1711    10
;
run;

proc sort data=testing out=tst;
by ssn acct_num id descending yymm ;
run;

data final;
set tst;
by ssn acct_num id;
if first.id;
run;

proc print data=testing;
proc print data=tst;
proc print data=final;
quit;

这是输出:

Obs SSN ACCT_num YYMM ID 
1 123456789 476543218 1711 10 
2 123456789 476543218 1801 2 
3 123456789 987654321 1801 1 
4 123456789 987654321 1711 9 

这是我想要的输出:

Obs SSN ACCT_num YYMM ID 
1 123456789 476543218 1801 2 
2 123456789 987654321 1801 1 

我希望通过SSN和帐号进行分组,获取最新的ID变量,其中最新的变量是YYMM值最高的变量。

2 个答案:

答案 0 :(得分:2)

根据输出,显示所需的输出是对SSN,帐号和YYMM下降进行排序,并选择first.ACCT_num,如下所示。

data testing;
input SSN ACCT_num YYMM ID $;
datalines;
123456789   987654321   1801    1
123456789   987654321   1711    9
123456789   476543218   1801    2
123456789   476543218   1711    10
;
run;

proc sort data=testing out=tst;
by ssn acct_num descending yymm ;
run;

data final;
set tst;
by ssn acct_num;
if first.acct_num;
run;

proc print data=testing;
proc print data=tst;
proc print data=final;
quit;

...和输出:

enter image description here

说明: SAS数据步骤中的BY语句为first.语句中的每个变量创建逻辑变量last.BY

如果有多个BY个变量,则会有一个默认顺序,其中排序顺序较低的项目(acct_numYYMMID)在{{1}中有所不同与更高排序顺序项相比,{}和first.更频繁。鉴于OP中的代码,last.变化最频繁。

在原始数据中,ID的值在所有观察中都是唯一的。因此,对于输入数据的所有四行,IDfirst.ID都为TRUE。这解释了原帖的输出。

last.ID之前在排序顺序中放置acct_num意味着当descending YYMM为TRUE时,对程序数据向量的观察将具有first.acct_num的最大值帐号。

另请注意,在数据步骤中使用了YYMM来选择数据,它会产生不正确的结果,因为在给定的if first.YYMM内,acct_num从不会在多个观察中重复,所以yymm始终为TRUE。

可以通过将first.YYMMfirst.变量保存到输出数据集并按如下方式打印来证明这一点。

last.

...和输出:

enter image description here

答案 1 :(得分:1)

使用proc sql实现此目的;

class Input2 {
    func inputString() -> String {
        let keyboard = FileHandle.standardInput
        let inputData = keyboard.availableData
        return String(data: inputData, encoding: .utf8)!
    }

    func inputInt() -> Int {
        let keyboard = FileHandle.standardInput
        let inputData = keyboard.availableData
        let str = String(data: inputData, encoding: .utf8)!
        let i = Int(str.replacingOccurrences(of: "\n", with: ""))!
        return i
    }
}

var inp = Input2()
print("Please enter your name")
var name:String = inp.inputString()
print("line: \(name)")
//var i = Int(name.replacingOccurrences(of: "\n", with: ""))!
print("Enter a number:")
var i = inp.inputInt()
print(i)