1

分析では、分析を行う前に、csv(xls)から生データを読み取り、SASデータセットに変換する必要があります。

現在、問題は、この生データには一般に2つの問題があることです。1。列の順序が時々変更されます。したがって、以前の期間に変数A、B、Cの順に列がある場合、B、C、Aの順に変更される可能性があります。2。「#」や「」などの外部要素があります。 「」、「いくつかの文字」など。ここで、SASに読み込む前に、まず生データをクリーンアップする必要があります。これにはかなりの時間がかかります。データを読み取る前に、SASシステム自体のデータをクリーンアップする方法はありますか?SASコードを使用してデータを修正できれば、かなりの時間を節約できます。

次に例を示します。

期間1:この形式でData1.csvのデータを取得しました。数値の列Bには、「#」と「。」があります。そして、同じく数値である列C、私は「g」を持っています。PROC IMPORTまたはInfileステートメントのいずれかを使用してData1.csvをインポートすると、列BおよびCのこれらの外部要素は残ります。ここでの問題は、それをどのように行うかです。IfSTATEMENTを使用できます。しかし、問題は、外部要素が多すぎることです(たとえば、「#」、「。」、「g」の代わりに、「$」、「h」などの他の外部要素を取得する可能性があります)。 SASに生データをインポートするたびにIFSTATEMENTを使用して指定しなくても、外部要素を検出して削除するコード。

   A    B   C
Name1   1   5
Name2   2   6
Name3   3   4
Name4   #   g
Name5   5   3
Name6   .   6

期間2:この期間に、以下に示すDATA2.csvを取得しました。INFILEステートメントを使用するときは、最初にAを特定の名前で読み取り、次にBを特定の名前で読み取り、次にCを読み取る必要があることを指定します。データを取得する2番目の期間では、Bに1番目が与えられます。したがって、SASがAではなくBのデータを読み取る場合、前のフェーズデータとの変数の順序を毎回確認し、infileステートメントを使用してデータを読み取る前に修正する必要があります。変数の数が多すぎるため、この方法で列の順序を確認するのは非常に時間がかかります(そして時にはイライラします)。SASがA、B、Cの順に自動的に読み取るSASコードはありますか?

B   A   C
1   Name1   5
2   Name2   6
3   Name3   4
#   Name4   g
5   Name5   3
.   Name6   6

私は主に分析目的でSASを使用していますが。ただし、Rを使用してデータをクリーンアップし、SASでデータを読み取ってさらに分析することはできます。したがって、Rコードも役立ちます。

ありがとう。

4

2 に答える 2

3

Rでは、列が特定のクラスであることを指定すると、ファイルの読み取り速度が向上します。提供されている例(中央の列が「文字」である3つの列)では、次のコードを使用できます。

 dat <- read.csv( filename, colClasses=c("numeric", "character", "numeric"), comment.char="")

「#」と「。」数値列で検出されると、NA値になります。上記のコードは、コメント文字のデフォルト指定である「#」を削除します。「#」と「。」が必要な場合 NA_character_に強制変換される文字列のエントリには、次のコードを使用できます。

dat <- read.csv( filename, 
                 colClasses=c("numeric", "character", "numeric"),
                 comment.char="",
                 na.strings=c("NA", ".", "#") )

デフォルトでは、header=TRUE設定はread.csv()によって想定されますが、read.table()を使用した場合はheader=TRUE、表示した2つのファイル構造でアサートする必要があります。ここには、Excelデータを読み取るための追加のドキュメントと実際の例があります。ただし、CSV転送を計画して使用するときに、実行することをお勧めします。そのようにして、Excelが日付と欠落値に対して行う厄介なことをより迅速に確認できます。POSIX標準に準拠して、データ形式をカスタムの「yyyy-mm-dd」に変更することをお勧めします。この場合、「日付」クラスの列を指定して、文字クラスの列を変換するプロセスをスキップすることもできます。デフォルトのExcel形式(すべて悪い)を日付に変換します。

于 2012-08-25T19:48:46.060 に答える
2

はい、SASを使用して、想像できるあらゆる種類の「データクリーニング」を実行できます。SAS DATAステップ言語には、このようなことを行うための機能がたくさんありますが、特効薬はありません。自分でコードを書く必要があります。

csvファイルは単なるテキストファイルです(ファイルとは大きく異なりますxls)。通常、csvファイルの最初の行には列名が含まれ、データは2番目の行から始まります。を使用するPROC IMPORTと、SASは最初の行を使用して変数名を作成し、ファイルの最初の数行をスキャンしてデータ型を判別しようとします。例えば:

proc import datafile='c:\temp\somefile.csv'
     out=SASdata
     dbms=csv replace;
run;

または、データステップを使用してファイルを読み取ることもできます。これには、事前にファイルレイアウトを知っている必要があります。例えば:

data SASdata;
   infile 'c:\temp\somefile.csv' dsd firstobs=2 lrecl=32767 truncover;
   informat A $50.; /* A character variable with max length 50 */
   informat B yymmdd10.; /* A date presented like 2012-08-25 */
   informat C dollar12.; /* A number containing dollar sign, commas, or decimals */

   input A B C;  /* The order of the variables in the file */

   if B = . then B = today(); /* A possible data cleaning statement */
run;

INPUTステートメントは、変数がファイルに存在する順序を制御することに注意してください。重要なのは、使用するコードは、処理する各ファイルのレイアウトと一致している必要があるということです。

これらは単なる一般的なコメントです。問題が発生した場合は、より具体的な質問を投稿してください。

更新された質問の更新:生データファイルの変数は、各ファイルに存在するのと同じ順序でINPUTステートメントにリストされている必要があります。また、列タイプを直接定義し、それらが従う必要のあるルールを確立する必要があります。これを自動的に行う方法はありません。各ファイルは多くの場合別々に扱われます。

この場合、変数がA、B、およびCであると仮定します。ここで、Aは文字であり、BおよびCは数値です。このプログラムは両方のファイルを処理し、それらを履歴データセット(たとえばALLDATA)に追加する場合があります。

data temp;
   infile 'c:\temp\data1.csv' dsd firstobs=2 lrecl=32767 truncover;
   /* Define dataset variables */
   informat A $50.;
   informat B 12.;
   informat C 12.;
   /* Add a KEEP statement to keep only the variables you want */
   keep A B C;

   input A B C;
run;
proc append base=ALLDATA data=temp;
run;
data temp;
   infile 'c:\temp\data2.csv' dsd firstobs=2 lrecl=32767 truncover;
   informat A $50.;
   informat B 12.;
   informat C 12.;

   input B A C;
run;
proc append base=ALLDATA data=temp;
run;

各データステップの「データ定義」部分は同じであることに注意してください。INPUT唯一の違いは、ステートメントにリストされている変数の順序です。変数AとBは数値として定義されているため、これらの無効な文字(#とg)が読み取られると、値は欠落値として格納されることに注意してください。

あなたの場合、私はテンプレートSASプログラムを作成して、必要なすべての変数を期待どおりの順序で定義します。次に、そのテンプレートを使用して、そのファイル内の変数の順序を使用して各ファイルをインポートします。テンプレートプログラムの設定には時間がかかる場合がありますが、それを実行するには、INPUTステートメントを変更するだけで済みます。

于 2012-08-25T18:18:19.317 に答える