答案 0 :(得分:0)
您只能将平面文件导入SAS,因此您需要先清理标题。
按照此处的说明删除顶部和侧面的空白“姓氏”: http://www.extendoffice.com/documents/excel/771-excel-fill-blank-cells-with-value-above.html
一旦没有空白,我认为将名字和姓氏连接成一个单元格是最容易的。顶部有一个类似= CONCATENATE(C1,C2)的东西,而旁边的= CONCATENATE(A4 | B4)应该可以解决这个问题。
仅将连接的值复制并粘贴到自身上以删除公式。然后删除原始值。
你应该得到这样的结论:Screenshot of Excel Data Ready to Import
现在,导入SAS并使用如下所示的程序堆叠值:
PROC TRANSPOSE DATA = import_from_excel
OUT=data_stacked
;
BY Names;
VAR
lastname1firstname1
lastname1firstname2
lastname1firstname3
lastname1firstname4
lastname1firstname5
lastname2firstname1
lastname2firstname2
lastname2firstname3
lastname2firstname4
lastname2firstname5
;
RUN;
您显然必须更改lastnameXfirstnameX值以匹配您拥有的值,但它应该像从Excel复制和粘贴A列一样简单。
希望你没有这么多的名字来压倒proc转置,但清理和堆叠它是基本的想法。
答案 1 :(得分:0)
您可以告诉SAS导入没有名称的“矩阵”。这将使您能够将名称作为数据读取,并强制所有变量为字符串。所以基本上你会得到像这样的数据集。
data have ;
length f1-f6 $32 ;
infile cards dsd truncover ;
input f1-f6 ;
cards;
,,L1,,L2
,,F1,F2,F3,F4
,,,,,,
L3,F5,1,2,3,4
,F6,5,6,7,8
L4,F7,9,10,11,12
,F8,13,14,15,16
;;;;
然后,您可以处理数据集并生成from / to name变量。首先创建一个引用所有变量的数组。然后创建两个临时数组来存储列标题名称。然后,当您读取每一行时,您可以从该行中找到名称和值并输出它们。
data want ;
set have nobs=nobs ;
array x _character_ ;
array ln (200) $32 _temporary_;
array fn (200) $32 _temporary_;
length from_lastn lag_lastn from_firstn to_lastn to_firstn $32 ;
from_lastn = coalescec(x(1),lag_lastn);
lag_lastn = from_lastn ;
retain lag_lastn ;
from_firstn = x(2) ;
if _n_=1 then do i=3 to dim(x) ;
ln(i)=coalescec(x(i),ln(i-1));
end;
if _n_=2 then do i=3 to dim(x) ;
fn(i)=x(i);
end;
if _n_>3 then do i=3 to dim(x) ;
to_lastn = ln(i);
to_firstn= fn(i);
value=input(x(i),comma32.);
output;
end;
keep from_lastn from_firstn to_lastn to_firstn value ;
run;