मैं नीचे की तरह डेटासेट बनाना चाहता हूं। मुझे मिल गया, लेकिन यह एक लंबा कार्यक्रम है। मुझे लगता है कि यह और आसान हो जाएगा। यदि आपके पास कोई अच्छा विचार है तो कृपया मुझे कुछ सलाह दें। यहां छवि विवरण दर्ज करें

यह डेटा है।

data test;
input ID $ NO DAT1 $ TIM1 $ DAT2 $ TIM2 $;
cards;
1   1   2020/8/4    8:30    2020/8/5    8:30
1   2   2020/8/18   8:30    2020/8/19   8:30
1   3   2020/9/1    8:30    2020/9/2    8:30
1   4   2020/9/15   8:30    2020/9/16   8:30
2   1   2020/8/4    8:34    2020/8/5    8:34
2   2   2020/8/18   8:34    2020/8/19   8:34
2   3   2020/9/1    8:34    2020/9/2    8:34
2   4   2020/9/15   8:34    2020/9/16   8:34
3   1   2020/8/4    8:46    2020/8/5    8:46
3   2   2020/8/18   8:46    2020/8/19   8:46
3   3   2020/9/1    8:46    2020/9/2    8:46
3   4   2020/9/15   8:46    2020/9/16   8:46
;
run;

यह मेरा कार्यक्रम है।

 data
 t1(keep = ID A1 A2 A3 A4)
 t2(keep = ID B1 B2 B3 B4)
 t3(keep = ID C1 C2 C3 C4)
 t4(keep = ID D1 D2 D3 D4);
 set test;
 if NO = 1 then do;
 A1 = DAT1;
 A2 = TIM1;
 A3 = DAT2;
 A4 = TIM2;
 end;
 *--- cut (NO = 2, 3, 4 are same as NO = 1)--- ;
 end;
 if NO = 1 then output t1;
 if NO = 2 then output t2;
 if NO = 3 then output t3;
 if NO = 4 then output t4;
run;

proc sort data = t1;by ID; run;
proc sort data = t2;by ID; run;
proc sort data = t3;by ID; run;
proc sort data = t4;by ID; run;
data test2;
 merge t1 t2 t3 t4;
 by ID;
run;
2
51sep 28 अक्टूबर 2020, 11:07

2 जवाब

सबसे बढ़िया उत्तर

लंबे से बहुत व्यापक डेटा परिवर्तन आमतौर पर होते हैं

  • स्केची, आप डेटा को मेटाडेटा (कॉलम नाम या लेबल) में डालते हैं या संदर्भात्मक संदर्भ खो देते हैं, या
  • मानव उपभोग के लिए एक रिपोर्टिंग लेआउट

अपने "नीचे की तरह डेटासेट के रूप में" मान लेना सटीक है और आप अपने डेटा को इस तरह से पिवट करना चाहते हैं।

पहला तरीका - नाम बदलने के साथ स्व-विलय उपसमुच्चय

आपको यह देखना चाहिए कि NO फ़ील्ड एक अनुक्रम संख्या है जिसे डेटा सेट को मर्ज करते समय BY चर के रूप में उपयोग किया जा सकता है।

इस उदाहरण कोड को एक टेम्पलेट के रूप में देखें जो मैक्रो का स्रोत कोड निर्माण हो सकता है:

बेहतर स्पष्टता के लिए NO का नाम बदलकर seq कर दिया गया है

data want;
  merge
    have (where=(seq=1) rename=(dat1=A1 tim1=B1 dat2=C1 tim2=D1)
    have (where=(seq=2) rename=(dat1=A2 tim1=B2 dat2=C2 tim2=D2)
    have (where=(seq=3) rename=(dat1=A3 tim1=B3 dat2=C3 tim2=D3)
    have (where=(seq=4) rename=(dat1=A4 tim1=B4 dat2=C4 tim2=D4)
  ;
  by id;
run;

उपरोक्त पैटर्न की तरह संगठित अज्ञात डेटा सेट के लिए, कोड निर्माण की आवश्यकताएं स्पष्ट होनी चाहिए; अधिकतम seq निर्धारित करें और पिवट करने के लिए चर के नाम निर्दिष्ट करें (मैक्रो पैरामीटर के रूप में, जिसमें नामों पर लूप होता है)।

रास्ता २ - एकाधिक स्थानान्तरण

सावधानी, सभी पिवोटेड कॉलम वर्ण प्रकार के होंगे और इसमें मूल मानों का स्वरूपित परिणाम होगा।

proc transpose data=have(rename=(dat1=A tim1=B dat2=C tim2=D)) out=stage1;
  by id seq;
  var a b c d;
run;
  
proc transpose data=stage1 out=want;
  by id;
  var col1;
  id _name_ seq;
run;

तरीका ३ - सरणी और डॉव लूप का उपयोग करें

* presume SEQ is indeed a unit monotonic sequence value;
data want (keep=id a1--d4);
  do until (last.id);
    array wide A1-A4 B1-B4 C1-C4 D1-D4;
    wide [ (seq-1)*4 + 1 ] = dat1;
    wide [ (seq-1)*4 + 2 ] = tim1;
    wide [ (seq-1)*4 + 3 ] = dat2;
    wide [ (seq-1)*4 + 4 ] = tim2;
  end;
  
  keep id A1--D4;

*  format A1 A3 B1 B3 C1 C3 D1 D3 your-date-format;
*  format A2 A4 ................. your-time-format;

तरीका ४ - अपने डेटा मानों को datetime . में बदलें

मैं इसे सम्मानित दूसरों पर छोड़ दूँगा

0
Richard 29 अक्टूबर 2020, 13:27

चूंकि परिणाम ऐसा दिखता है जैसे कोई रिपोर्ट रिपोर्टिंग टूल का उपयोग करती है।

proc report data=test ;
  column id no,(dat1 tim1 dat2 tim2 n) ;
  define id / group width=5;
  define no / across ' ' ;
  define n / noprint;
run;
2
Tom 28 अक्टूबर 2020, 15:19