Dasar-dasar pemrograman SAS Base. Pelajaran 4. Membuat Kumpulan Data SAS

Dalam artikel sebelumnya , kami belajar cara membaca data mentah eksternal. Hari ini kita akan berkenalan dengan operator SET, yang membaca set data SAS standar (SAS Data Set), mempelajari cara membuat irisan data, mengkonfigurasi atribut persisten, dan juga mempelajari beberapa fungsi SAS yang berguna. Sekali lagi, saya akan mencoba menyajikan materi dalam bahasa yang sesederhana mungkin, menggunakan sebanyak mungkin contoh.



Katakanlah data disimpan dalam format EXCEL di direktori C: \ workshop \ habrahabr . Kami mengimpor spreadsheet, membuat sepotong darinya, membuat kolom terhitung baru menggunakan fungsi SAS, dan kemudian membagi kumpulan data ini menjadi dua.

Impor spreadsheet dan atur filter



File excel disimpan dalam direktori di atas dan terlihat seperti ini:

Cuplikan file:


Kami menerapkan prosedur IMPOR PROC untuk mengonversi spreadsheet ke dataset SAS:

options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company replace; getnames=yes; run; 

Opsi validvarname = V7 menetapkan nama bidang yang benar dari sudut pandang SAS: mengganti semua karakter yang tidak valid dengan garis bawah. Aturan untuk variabel penamaan dapat ditemukan di Pelajaran 1.

Kami segera menetapkan filter saat membaca file eksternal, misalnya, kami hanya memilih pengamatan di mana tanggal akhir tidak hilang. Perhatikan sintaks parameter where.

 options validvarname=v7; proc import datafile="C:\workshop\habrahabr\company.xlsx" dbms=xlsx out=company (where=(End_Date not is missing)) replace; getnames=yes; run; 

Mari kita pertimbangkan secara rinci operator langkah PROC IMPORT:

Datafile - mendefinisikan path lengkap dan nama file eksternal
Dbms - Menentukan tipe data yang akan diimpor.
Out - mengidentifikasi dataset SAS output dengan nama SAS satu atau dua tingkat (nama perpustakaan dan nama dataset).
Ganti - Timpa dataset SAS yang ada.
Getnames - Menunjukkan apakah PROC IMPORT menghasilkan nama variabel SAS dari nilai data di baris pertama dari file eksternal input.

Jalankan langkah IMPOR PROC dan periksa LOG:


Cetak dataset SAS yang dihasilkan:

 proc print data=work.company noobs; run; 

Output dari prosedur PROC PRINT ditunjukkan di bawah ini:

Fragmen:


Juga di SAS UE, Anda dapat menggunakan tab Hasil untuk melihat dataset SAS yang diimpor.


Membaca Kumpulan Data SAS



Membaca dataset SAS diimplementasikan pada langkah DATA menggunakan pernyataan SET :

Pertimbangkan sintaks umum untuk pernyataan SET:

 SET<SAS-data-set(s) <(data-set-options(s) )> > <options>; 

Jika Anda tidak menentukan dataset dalam pernyataan SET, maka ia membaca pengamatan dari dataset SAS yang terakhir dibuat.

Dalam pernyataan SET, Anda dapat menentukan beberapa set data, dalam hal ini, Set Data SAS akan ditambahkan satu di bawah yang lain (mirip dengan UNION dalam SQL).

Juga, pada langkah DATA, bisa ada dua pernyataan SET, dalam hal ini tabel digabungkan dengan kolom umum. Anda dapat membaca lebih lanjut tentang dua pernyataan SET dalam artikel ini , misalnya.

Kode paling sederhana untuk membuat salinan dataset SAS adalah sebagai berikut:

 data company1; set company; run; 

Mengkonfigurasi Descriptor Dataset SAS


Anda dapat memeriksa deskriptor dataset SAS menggunakan prosedur ISI PROC ( lihat Pelajaran 2 ). Dalam tutorial ini, kami akan mencetak komponen deskriptor menggunakan prosedur PROC DATASETS :

 proc datasets library=work nolist; contents data=company order=varnum; quit; 

Sebuah fragmen hasil:


Tetapkan format konstan untuk variabel Travel_Expenses dan Anggaran:

 data company; set company; format Travel_Expenses Budget dollar10.2; run; 

Periksa atribut dataset SAS:

 proc datasets library=work nolist; contents data=company order=varnum; quit; 


Membuat kolom terhitung


Semua fungsi SAS dapat dieksplorasi dalam Fungsi SAS 9.4 dan Rutin PANGGILAN: Referensi, Edisi Kelima .

Selain itu, jika tidak ada fungsi yang sesuai untuk melakukan tugas tertentu, Anda dapat menggunakan prosedur PROC FCMP dan membuat fungsi Anda sendiri.

Dalam pelajaran ini, kita akan mengeksplorasi tiga fungsi YRDIF, SUM, dan CATS.

Untuk menghitung perbedaan tanggal dalam tahun, kami akan menggunakan fungsi YRDIF .

Biarkan saya mengingatkan Anda bahwa tanggal dalam format SAS adalah jumlah hari mulai 01 Januari 1960 ( lihat Pelajaran 1 ). Pada data yang disajikan, kita perlu menghitung waktu eksekusi:

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); format Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Harap perhatikan bahwa menggunakan format 3.1 untuk variabel Lead_Time, kami membulatkan nilai yang dihitung dalam laporan (!) Ke 1 tempat desimal. Operator format tidak mengubah nilai dalam dataset SAS!

Sebuah fragmen hasil:


Selanjutnya, kami menghitung biaya kerja tanpa biaya perjalanan:

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Sebuah fragmen hasil:


Sebagai bagian dari tugas kami, kami menghitung biaya kerja tanpa memperhitungkan biaya perjalanan tanpa menggunakan fungsi. Tidak ada nilai yang hilang dalam tabel kami, jika salah satu variabel (Anggaran atau Travel_Expenses) memiliki nilai yang hilang, hasilnya adalah "misi".

Sebagai contoh:

Buat set data uji:

 data test; input Budget Travel_Expenses; datalines; 12345 233 . 345 12543 . ; 

Hitung perbedaan dalam variabel Budget Travel_Expenses

 data test; set test; value=Budget-Travel_Expenses; run; 

Hasil dari langkah ini:


Untuk mendapatkan hasil yang benar, Anda dapat menggunakan fungsi SUM .

Fungsi ini termasuk dalam kategori fungsi statistik deskriptif . Fungsi statistik deskriptif mengabaikan nilai yang hilang.

Menulis kode melalui SUM:

 data test; set test; value=sum(Budget,-Travel_Expenses); run; 

Dalam hal ini, hasil langkahnya adalah sebagai berikut:


Kolom terhitung ketiga adalah alamat email manajer. Itu bisa "dirakit" dari kolom Manager_FirstName, Manager_LastName dan nilai-nilai habr .com

Anda dapat menggunakan fungsi CATS untuk menggabungkan nilai teks menjadi satu baris.

 data company1; set work.company; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Sebuah fragmen hasil:


Mari kita periksa deskriptor dari kumpulan data yang dibuat:

 proc contents data=work.company1 varnum; run; 

Menangani fragmen:


Perhatikan panjang variabel Email. Ini adalah 200 byte, ini adalah panjang default yang dikembalikan oleh fungsi CATS. Jika kita memeriksa atribut variabel Manager_FirstName dan Manager_LastName, kita dapat memastikan bahwa 8 + 6 + panjang string '@ habr.com' cukup untuk variabel Email, yaitu, 9 byte, total 23. Mengapa saya harus memperhatikan hal ini? Semua karakter yang hilang mencapai spasi, yang memengaruhi ukuran kumpulan data dan akan memengaruhi kinerja sejumlah besar data.

Untuk mengatur panjang variabel Email secara eksplisit, Anda harus menggunakan operator LENGTH:

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; run; 

Tangani fragmen


Buat kolom terperinci berdasarkan pada variabel Lead_Time, dengan mempertimbangkan kondisi berikut:

  1. Jika nilai variabel Lead_Time kurang dari 1, maka kolom Detail memiliki nilai kurang dari 1 tahun.
  2. Jika nilai variabel Lead_Time berada dalam kisaran dari 1 hingga 2, termasuk batas, maka kolom Detail memiliki nilai 1-2 tahun.
  3. Jika nilai variabel Lead_Time berada dalam kisaran 2 hingga 3, tidak termasuk 2, maka kolom Detail memiliki nilai 2-3 tahun.
  4. Jika nilai variabel Lead_Time berada dalam kisaran 3 hingga 4, tidak termasuk 3, maka kolom Detail memiliki nilai 3-4 tahun.
  5. Jika nilai variabel Lead_Time berada dalam kisaran 4 hingga 5, tidak termasuk 4, maka kolom Detail memiliki nilai 4-5 tahun.
  6. Dalam semua kasus lain, kolom Detail memiliki nilai di atas 5 tahun.

Anda dapat membuat kolom terperinci dengan berbagai cara, misalnya, opsi paling sederhana dan paling jelas adalah menggunakan pemrosesan bersyarat. Itu dapat diimplementasikan menggunakan operator berikut:

  1. JIKA-KEMUDIAN LAIN
  2. LAIN JIKA
  3. PILIH-KAPAN

Untuk sejumlah besar data, lebih efisien menggunakan dua opsi terakhir.

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='4-5 years'; else detail='above 5 years'; run; 

Tambahkan kondisi yang hanya memilih pengamatan di mana nilai variabel Detail tidak sama dengan 'di atas 5 tahun'. Saat menggunakan tempat sebagai filter, kesalahan sintaksis akan terjadi:


Klausa mana tidak digunakan untuk kolom yang dihitung. Untuk memilih variabel yang kita butuhkan, kita membutuhkan pernyataan IF selektif. Ini membatalkan output pengamatan ke set data yang dibuat:

 data company1; set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

Perhatikan juga bahwa pernyataan IF selektif membutuhkan operator aritmatika. Kami tidak dapat menulis, misalnya, seperti ini:

 if detail contains 'above 5 years'; 

Kesalahan akan ditampilkan di Log:


Konfigurasikan dataset SAS.


Variabel Manager_FirstName dan Manager_LastName tidak boleh ada dalam dataset SAS baru. Persyaratan ini diimplementasikan menggunakan parameter DROP, dan operator DROP juga dapat digunakan.

 data company1 (drop=Manager_FirstName Manager_LastName); set work.company; length Email $23; Lead_Time=yrdif(Start_Date, End_Date, 'actual'); Cost=Budget-Travel_Expenses; Email=cats(Manager_FirstName, '.',Manager_LastName, '@habr.com'); format Cost Travel_Expenses Budget dollar10.2 Lead_Time 3.1; if Lead_Time<1 then detail='less than a year'; else if Lead_Time=>1 and Lead_Time<=2 then detail='1-2 years'; else if Lead_Time>2 and Lead_Time<=3 then detail='2-3 years'; else if Lead_Time>3 and Lead_Time<=4 then detail='3-4 years'; else if Lead_Time>4 and Lead_Time<=5 then detail='2-3 years'; else detail='above 5 years'; if detail ne 'above 5 years'; run; 

Kami membagi dataset SAS yang dibuat menjadi dua sesuai dengan kondisi yang diberikan


Dalam satu langkah DATA, Anda dapat membuat beberapa dataset SAS. Buat kumpulan data terpisah untuk setiap negara.

Untuk memeriksa nilai apa yang ada di kolom Negara, misalnya, Anda dapat menggunakan prosedur PROC FREQ .

 proc freq data=company1; table Country /nocum nopercent; run; 

Langkah ini mempertimbangkan berapa kali nilai tertentu dari variabel Negara terjadi dalam dataset SAS yang ditentukan dalam data = parameter.

Hasil dari langkah ini adalah sebagai berikut:


Jadi, kami akan membuat dua set data pada satu langkah DATA menggunakan operator OUTPUT dan pemrosesan bersyarat:

 data US AU; set work.company1; if Country='AU' then output AU; if Country='US' then output US; run; 

Jalankan kode dan lihat LOG:


Ini secara singkat tentang membaca dan mengkonfigurasi dataset SAS. Pada artikel selanjutnya, kami akan memperkenalkan Anda untuk menggabungkan dataset menggunakan pernyataan MERGE dan SET.

Dan sebagai PS, saya akan mengingatkan Anda struktur pelajaran SAS BASE kami:

Artikel yang sudah diterbitkan:

  1. Dasar-dasar pemrograman pada SAS BASE. Pelajaran 1.
  2. Dasar-dasar pemrograman pada SAS BASE. Pelajaran 2. Akses Data
  3. Dasar-dasar pemrograman pada SAS BASE. Pelajaran 3. Membaca file teks.
  4. Anda baru saja belajar pelajaran keempat.

Dalam artikel berikut ini saya ingin menyoroti masalah seperti bergabung dengan tabel di SAS Base (menggabungkan, mengatur), pemrosesan bersyarat, loop, fungsi SAS, membuat format khusus, SAS Macro, PROC SQL.

Saya akan dengan senang hati memberi tanggapan dalam komentar! Apa topik lain yang ingin Anda lihat di artikel?

Source: https://habr.com/ru/post/id426765/


All Articles