我试图在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值最高的变量。
答案 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;
...和输出:
说明: SAS数据步骤中的BY
语句为first.
语句中的每个变量创建逻辑变量last.
和BY
。
如果有多个BY
个变量,则会有一个默认顺序,其中排序顺序较低的项目(acct_num
,YYMM
和ID
)在{{1}中有所不同与更高排序顺序项相比,{}和first.
更频繁。鉴于OP中的代码,last.
变化最频繁。
在原始数据中,ID
的值在所有观察中都是唯一的。因此,对于输入数据的所有四行,ID
和first.ID
都为TRUE。这解释了原帖的输出。
在last.ID
之前在排序顺序中放置acct_num
意味着当descending YYMM
为TRUE时,对程序数据向量的观察将具有first.acct_num
的最大值帐号。
另请注意,在数据步骤中使用了YYMM
来选择数据,它会产生不正确的结果,因为在给定的if first.YYMM
内,acct_num
从不会在多个观察中重复,所以yymm
始终为TRUE。
可以通过将first.YYMM
和first.
变量保存到输出数据集并按如下方式打印来证明这一点。
last.
...和输出:
答案 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)