3

SASには、(LIBNAMEを使用して)ライブラリを作成する方法があります。これは、長いデータ処理を行う必要がある場合に、データセット名を常に変更するとは限らないため、役立ちます。したがって、名前を変更せずにデータセットを再度使用する場合は、ライブラリに入れることができます。したがって、データセット名が同じであっても、それらは異なるライブラリにあるため、一緒に作業できます。

私の質問は、ライブラリ(またはR内の別のフォルダ)を作成してそこにデータを保存できるようなオプションがRにあるかどうかです。

次に例を示します。

データセット「dat1」があるとします。var3のdat1var1とvar2の変数を要約します。

proc summary data=dat1 nway missing;
  var var1 var2;
  class var3;
  output out=tmp.dat1 (drop = _freq_ _type_) sum = ;
  run;

次に、dat1を別のデータセットであるdat2とマージしました.dat1とdat2の両方に、マージした共通変数var3があります。新しいデータセットdat1を再度作成しました。

proc sql;
   create table dat1 as
   select a.*,b.*
   from dat1 a left join tmp.dat2 b
   on a.var3=b.var3;
  quit;

ここで、マージ後にデータセットdat1を再度要約して、マージの前後でvar1とvar2の値が同じままであるかどうかを確認します。

proc summary data=dat1 nway missing;
  var var1 var2;
  class var3;
  output out=tmp1.dat1 (drop = _freq_ _type_) sum = ;
  run;

Rの同等のコードは次のようになります

dat3<-ddply(dat1,.(var3),summarise,var1=sum(var1,na.rm=TRUE),var2=sum(var2,na.rm=TRUE))

dat1<-sqldf("select a.*,b.* from dat1 a left join dat2 b on a.var3=b.var3")

dat4<-ddply(dat1,.(var3),summarise,var1=sum(var1,na.rm=TRUE),var2=sum(var2,na.rm=TRUE))

SASの場合、2つのデータセット名のみを使用しました。しかし、Rの場合、私は4つのデータセット名を使用しています。したがって、データ処理用に4000行のコードを記述している場合、データセット名が多すぎると圧倒されることがあります。SASでは、デフォルトの作業ライブラリ以外の2つのライブラリtmp、tmp1を使用しているのと同じデータセット名を使用することが簡単になりました。

SASでは、ライブラリは次のように定義されています。

LIBNAME tmp "directory_path\folder_name";

このフォルダには、dat1が保存されます。

4

4 に答える 4

6

SASオンラインヘルプから収集できることから、SASライブラリは、フォルダーに格納されているデータセットのセットであり、1つの単位として参照できます。Rでの同等の機能は、以下を使用して保存するRオブジェクトを格納することですsave

save(obj1, obj2, etc, file = "stored_objects.rda")

オブジェクトのロードは、を使用して実行できますload

編集:追加のオブジェクトを1つか2つ持つことがなぜそれほど問題になるのか、私にはよくわかりません。ただし、オブジェクトの量を減らしたい場合は、結果をに入れてくださいlist

于 2012-10-14T11:17:08.383 に答える
5

SASのライブラリには、(そう思われる)2つの異なる側面があります。

  • データファイルが保存されるディレクトリの仕様
  • 別の場所を指定するだけで、同じ名前のデータセットの別のセットに分析を簡単に向けることができます

これらをこの順序で取得します。

最初に答える際の問題は、RとSASがデータの保存方法について異なるモデルを持っていることです。Rは、特定の検索順序で配置された環境で編成されたデータをメモリに格納します。SASはデータをディスクに保存し、データセットの名前は指定されたディレクトリ内のファイル名に対応します(最適化のためにメモリにキャッシュされる可能性がありますが、概念的にはこれがデータの保存方法です)。Rは、を使用してオブジェクト(のセット)をディスク上のファイルに格納し、を使用save()してそれらをメモリに戻すことができますload()。ファイル名とディレクトリは、これらの関数呼び出しで指定できます(したがって、Paulの回答)。複数のファイルを作成できます。各ファイルには、など.RDataの名前のオブジェクトが含まれており、分析を実行する前にロードして、結果を(その他)に書き出すことができます。dat1dat2.RDataファイル。

これに代わる方法は、メモリの代わりにディスクストレージによってバックアップされるデータ型を提供する拡張機能の1つを使用することです。この状況でどれだけうまく機能するかについて話す経験はありませんが、それはオプションです。[編集:mnelの回答には、このアイデアの詳細な例があります。]

2番目の部分には、さまざまな方法でアプローチできます。Rはメモリ内データを使用するため、回答は、さまざまな環境(それぞれに異なるが同じ名前のデータセットを含めることができます)の配置と、検索パスからの環境のattach()ingおよびingを介してアクセスする環境の制御( Glen_bの回答が取得するもの)に焦点を当てます。向かって)。データのディスクバッキングはまだありませんが、それは前の問題です。detach()

最後に、@joranの警告が関連しています。Rの潜在的に異なる(ただし関連する)データセットに対して一連のタスクを実行する問題の解決策は、作業を実行する関数を作成することです。関数にはパラメーターがあります。関数内では、パラメーターは引数リストで指定された名前で参照されます。関数が呼び出されると、関数呼び出しで指定された特定のデータセットが関数に送信されます。関数の内側と外側の名前は、互いに関係している必要はありません。複数のデータセットをリストに保存することに関する提案は、暗黙のうちにこの方法で問題に取り組んでいます。この関数は、リスト内のデータセットごとに順番に呼び出されます。それなら、名前は関係ありません。

于 2012-10-16T22:52:28.590 に答える
4

SOARパッケージと名前付き環境を使用した例を次に示します

ビネットから引用するには

オブジェクトは常にメモリに保持される必要はありません。関数saveは、ディスク上のオブジェクトをファイルに保存するために使用できます。通常、拡張子は.RDataです。その後、オブジェクトをメモリから削除し、後でロード関数を使用して明示的に呼び出すことができます。

SOARパッケージは、オブジェクトをディスクに保存する簡単な方法を提供しますが、オブジェクトが約束どおりに検索パスに表示されたままになるようにします。つまり、オブジェクトが再び必要になった場合、オブジェクトは自動的にメモリにロードされます。パッケージと同じ遅延読み込みメカニズムを使用しますが、ここで提供される機能はより動的で柔軟です

ビネット全体を読むと便利です

library(SOAR)
library(plyr)
library(sqldf)
set.seed(1)
# create some dummy data create a named envirment
tmp <- new.env(parent = .GlobalEnv)
dat1 <- data.frame(var1 = rnorm(50), var2 = sample(50, replace = TRUE), var3 = sample(letters[1:5], 
    50, replace = TRUE))
tmp$dat1 <- ddply(dat1, .(var3), summarise, var1 = sum(var1, na.rm = TRUE), 
    var2 = sum(var2, na.rm = TRUE))
tmp$dat2 <- data.frame(Var3 = sample(letters[1:5], 20, replace = TRUE), Var4 = 1:20)
# store as a SOAR cached object (on disc)
Store(tmp, lib = "tmp")

# replace dat1 within the global enviroment using sqldf create a new
# environment to work in with the correct version of dat1 and dat2
sqlenv <- tmp
sqlenv$dat1 <- dat1

dat1 <- sqldf("select a.*,b.* from dat1 a left join dat2 b on a.var3=b.var3", 
    envir = sqlenv)

# create a new named enviroment tmp1
tmp1 <- new.env(parent = .GlobalEnv)

tmp1$dat1 <- ddply(dat1, .(var3), summarise, var1 = sum(var1, na.rm = TRUE), 
    var2 = sum(var2, na.rm = TRUE))

# store using a SOAR cache
Store(tmp1, lib = "tmp")


tmp1$dat1

##   var3   var1 var2
## 1    a  1.336  378
## 2    b  8.514 1974
## 3    c  5.795  624
## 4    d -8.828  936
## 5    e 20.846 1490

tmp$dat1

##   var3    var1 var2
## 1    a  0.4454  126
## 2    b  1.4190  329
## 3    c  1.9316  208
## 4    d -2.9427  312
## 5    e  4.1691  298

あなたが期待tmp1$dat1し、tmp$dat1同一である必要があるかどうかはわかりません(とにかく私の例を考えれば)

于 2012-10-16T22:49:20.577 に答える
2

名前付き環境は、希望どおりのサウンドを実現するためのいくつかの方法の1つです。

個人的には、異なるデータフレームやリストがあまりない場合は、データの構造に応じて、データフレームやリストの内部など、他の方法で整理することに傾倒します。しかし、それぞれが多くの異なる種類のデータと関数で構成されている場合、環境は大幅に改善される可能性があります。それらはヘルプで説明されており、 r-blogへの多数の投稿でそれらについて説明されています。

しかし、振り返ってみると、R-Studioプロジェクトは、問題について考えている方法に近いかもしれません(R-Studioをまだ使用していない場合は、それを強くお勧めします)。プロジェクトがどのように機能するかを見てください。

于 2012-10-16T21:51:24.953 に答える