この章では、Oracle R Enterpriseを使用して、Oracle Databaseの表またはビューに格納されたデータを分析する方法を説明します。表のデータを分析する前に、「Oracle Databaseの表」の説明に従って、データベースに接続する必要があります。
この章の内容は次のとおりです。
この項の残りの部分では、Rに熟知していることを前提にします。
これらの例はすべて、オープン・ソースRのデフォルト・グラフィカル・ユーザー・インタフェースであるR Consoleを使用して作成されました。
ore.connect
、ore.attach
、ore.sync
およびore.ls
の詳細は、「Microsoft Windows上でのOracle R Enterpriseクライアントの起動」、「Linux、SolarisまたはAIX上でのOracle R Enterpriseクライアントの起動」および「Oracleデータベースへの接続」を参照してください。
Oracle R Enterpriseには、第5章で説明するOracle R Enterprise統計関数も組み込まれています。
Oracle R Enterpriseを使用してデータベース表に格納されているデータを分析するための最初のステップは、Microsoft Windows上でOracle R Enterpriseクライアントを起動することまたはLinux、SolarisまたはAIX上でOracle R Enterpriseクライアントを起動することです。
Oracle R Enterpriseによって作成されたオブジェクトは、ore
接頭辞で識別されます。ore.ls()
から返された任意のオブジェクトを選択し、class(OBJECTNAME)
またはclass(OBJECTNAME$COLUMN_NAME)
と入力します。
次に例を示します。
R> class(NARROW) [1] "ore.frame" attr(,"package") [1] "OREbase"
接頭辞ore
が、そのクラス名に適用されます。これは、そのオブジェクトが、Oracle Database 12cリリース1 (12.1)内の対応するオブジェクトのメタデータ(コメントではなく)を保持するOracle R Enterpriseによって作成されたオブジェクトであることを示しています。
2つの重要なメタデータ・オブジェクトは次のとおりです。
ore.frameは、データベース表にマップするOracle R Enterpriseメタデータ・オブジェクトです。ore.frameオブジェクトは、R data.frameに対応するものです。
ore.matrixは、マトリクスを格納するデータベース表にマップするOracle R Enterpriseメタデータ・オブジェクトです。ore.matrixオブジェクトは、R matrixに対応するものです。
ore.frame
またはore.matrix
は、class()
関数によって返すことができます。ore.frameデータの作成の例は、「データベースへのデータのロード」を参照してください。
Oracle R Enterpriseをインストールするときに、次のようにNARROWとONTIME_Sの2つの表がrquser
スキーマにロードされます。
R> ore.ls() [1] "NARROW" "ONTIME_S"
Oracle R Enterpriseには、次の関数が組み込まれています。
次の手順に従って、システムのファイルから、Oracle Database 12cリリース1 (12.1)へデータをロードします。
Rのマニュアルに記載されているread.table()
またはread.csv()
関数を使用して、ファイルの内容をRデータ・フレームにロードします。
次に、ore.create()
を使用して、データ・フレームを表にロードします。
ore.create(data_frame, table="TABLE_NAME")
これによって、data_frameがデータベース表TABLE_NAMEにロードされます。
この例では、数字と文字のペアで構成されるRデータ・フレームdf
を作成し、そのデータ・フレームを表DF_TABLEにロードします。この例は、データ・フレームと表では、ディメンションおよび最初の数個の要素は同じであるが、クラスの値は異なることを示しています。DF_TABLEのクラスはore.frameです。
R> df <- data.frame(A=1:26, B=letters[1:26]) R> dim(df) [1] 26 2 R> class(df) [1] "data.frame" R> head(df) A B 1 1 a 2 2 b 3 3 c 4 4 d 5 5 e 6 6 f R> ore.create(df, table="DF_TABLE") R> ore.ls() [1] "DF_TABLE" "NARROW" "ONTIME_S" R> class(DF_TABLE) [1] "ore.frame" attr(,"package") [1] "OREbase" R> dim(DF_TABLE) [1] 26 2 R> head(DF_TABLE) A B 0 1 a 1 2 b 2 3 c 3 4 d 4 5 e 5 6 f R>
ore.push(data-frame)
は、データベースに一時オブジェクトとしてRオブジェクトを格納し、そのオブジェクトのハンドルを返します。それは、データ・フレーム、マトリックスおよびベクトルを表に、リスト、モデルおよびその他のものをシリアライズ・オブジェクトに変換します。
この例では、Rコマンドc(1,2,3,4,5)
によって作成された数値ベクトルをOracle R Enterpriseオブジェクトであるvにプッシュします。
v <- ore.push(c(1,2,3,4,5)) R> class(v) [1] "ore.numeric" attr(,"package") [1] "OREbase" R> head(v) [1] 1 2 3 4 5
データベース表またはビューの内容を、メモリー内のRデータ・フレームにプルするには、ore.ls()
によって返されるオブジェクトの名前のore.pull(OBJECT_NAME)
を使用します。
注意: 表またはビューをRフレームにプルできるのは、データがRのメモリーに収まる場合のみです。 |
たとえば、次のように、ore.pull()
を使用して、表NARROWからデータ・フレームdf_narrow
を作成し、df_narrow
がデータ・フレームであることを確認します。
R> df_narrow <- ore.pull(NARROW) R> class(df_narrow) [1] "data.frame"
Oracle R Enterprise透過層によって、Rユーザーは、Oracleからそのユーザーのデスクトップ上のRのメモリーにデータをプルすることなく、R構文を使用して、データベースに格納されているオブジェクトを直接操作できます。
R言語構文は、Oracle Database 12cリリース1 (12.1)オブジェクトにマップされているオブジェクトに対してサポートされています。次のRデータ型が、オーバーロードされており、データベース・オブジェクトにマップされ、データベース内での実行が可能になっています。
文字、整数、数値および論理ベクトル、
ファクタ
データ・フレーム
マトリクスは、次の2つの状況でオーバーロードされます。
線形代数クロス積
高度な分析のための入力マトリクスの作成
class(object)
は、そのようなマップされたオブジェクトのデータ型をレポートします。次に例を示します。
R> class(NARROW$AGE) [1] "ore.numeric" attr(,"package") [1] "OREbase"
次の演算子および関数がサポートされています。これらの演算子および関数の構文およびセマンティクスは、Rのドキュメントを参照してください。これらのアイテムの構文およびセマンティクスは、対応するデータベースのマップされたデータ型(Oracle R Enterpriseデータ型とも呼ぶ)に使用する場合も変わりません。
数学的変換: abs、sign、sqrt、ceiling、floor、trunc、cummax、cummin、cumprod、cumsum、log、log10、log2、log1p、acos、acosh、asin、asinh、atan、atanh、exp、expm1、cos、cosh、sin、sinh、tan、tanh、gamma、lgamma、digamma、trigamma、round、signif、pmin、pmax、zapsmall
基本統計: mean、summary、min、max、sum、any、all、median、range、IQR、fivenum、mad、quantile、sd、var、table、rowSums、colSums、rowMeans、colMeans
算術演算子: +、-、*、/、^、%%、%/%
比較演算子: ==、>、<、!=、<=、>=
論理演算子: &、|、xor
集合演算子: unique、%in%
代入: <-、=、->
文字列演算: tolower、toupper、casefold、toString、chatr、sub、gsub、substr、substring、paste、nchar
データ・フレームの結合: cbind、rbind、merge
ベクトルの結合: append
ベクトルの作成: ifelse
サブセット: [、[[、$、head、tail、window、subset、Filter、na.omit、na.exclude、complete.cases
データの再編成: split、unlist
データ処理: eval、with、within、transform
applyのバリアント: tapply、aggregate、by
回帰: ore.lm()
- lm()
のバリアント
特別な値のチェック: is.na、is.finite、is.infinite、is.nan
メタデータ関数: attributes、nrow、NROW、ncol、NCOL、nlevels、names、row、col、dimnames、dim、length、row.names、col.names、levels、reorder
グラフィック: hist、boxplot、plot、smoothScatter
ガベージ・コレクション: gc(エラー後に暗黙的に作成された一時表および明示的に作成された一時表の削除)
変換関数: as.ore.{character, factor, integer, logical, numeric, vector}
テスト関数: is.ore.{character, factor, integer, logical, numeric, vector}
保存: ore.push(表は、Rメモリー内で自動的にリフレッシュされます)
次の追加の関数のカテゴリは、Oracle R Enterpriseデータ型との間の変換およびそのデータ型に対するチェックを提供します。
仮説検定: wilcox.test、ks.test、var.test、binom.test、chisq.test、t.test、bartlett.test
ベッセル関数: Bessel(I,J,K,Y)
ガンマ関数: gamma、lgamma、digamma、trigamma(算術関数グループの一部)
各種分布: 密度、累積分布、および標準分布のクォンタイル関数
マトリクス演算: %*%(マトリクスの乗算)、crossprod(マトリクスのクロス積)、tcrossprod(BをA回転置したマトリクスのクロス積)
「Oracle R Enterpriseの例」で説明するOracle R Enterpriseのサンプル・プログラムには、Oracle R Enterpriseデータ型でこれらの関数の各カテゴリを使用した例がいくつか含まれています。
Oracle R Enterpriseでは、すべてのデータの準備および分析をデータベース内で直接実行できるように、データの事前処理機能を広範囲にわたってサポートすることを原則としています。Oracle R Enterpriseで使用できない統計手法を使用する必要がある場合は、Oracle R Enterpriseを使用してデータを事前処理およびフィルタ処理すると、Rにプルするデータ量を大幅に削減できます。
必要とする特定の関数がOracle R Enterpriseでサポートされていない場合は、最初に、ore.pull()
を使用してRエンジン・メモリーにデータベースからデータを明示的にプルし、メモリー内Rオブジェクトを作成する必要があります。
次の例は、Oracle R Enterpriseデータ型でのRの使用方法を示しています。
# Push built-in R data set iris to database ore.create(iris, table="IRIS") head(iris) iris_projected = IRIS[, c("PETAL_LENGTH", "SPECIES")] R> head (iris_projected) PETAL_LENGTH SPECIES 0 1.4 setosa 1 1.4 setosa 2 1.3 setosa 3 1.5 setosa 4 1.4 setosa 5 1.7 setosa
df1 <- data.frame(x1=1:5, y1=letters[1:5]) df2 <- data.frame(x2=5:1, y2=letters[11:15]) merge (df1, df2, by.x="x1", by.y="x2") x1 y1 y2 1 1 a o 2 2 b n 3 3 c m 4 4 d l 5 5 e k # Create database objects to correspond to in-memory R objects df1 and df2 ore.df1 <- ore.create(df1, table="DF1") ore.df2 <- ore.create(df2, table="DF2") # Compare results R> merge (DF1, DF2, by.x="X1", by.y="X2") X1 Y1 Y2 0 1 a o 1 2 b n 2 3 c m 3 4 d l 4 5 e k
# Push built-in data set iris to database ore.create(iris, table="IRIS") aggdata <- aggregate(IRIS, by = list(IRIS$SPECIES), FUN = summary) class(aggdata) head(aggdata)
派生列を追加しても、データベース表は変更されません。「Oracle R Enterpriseでの派生列」を参照してください。
diverted_fmt <- function (x) { ifelse(x==0, 'Not Diverted', ifelse(x==1, 'Diverted','')) } cancellationCode_fmt <- function(x) { ifelse(x=='A', 'A CODE', ifelse(x=='B', 'B CODE', ifelse(x=='C', 'C CODE', ifelse(x=='D', 'D CODE', 'NOT CANCELLED')))) } delayCategory_fmt <- function(x) { ifelse(x>200,'LARGE', ifelse(x>=30,'MEDIUM','SMALL')) } zscore <- function(x) { (x-mean(x,na.rm=TRUE))/sd(x,na.rm=TRUE) # ONTIME_S is a database table ONTIME_S$DIVERTED <- diverted_fmt(DIVERTED) ONTIME_S$CANCELLATIONCODE <- cancellationCode_fmt(CANCELLATIONCODE) ONTIME_S$ARRDELAY <- delayCategory_fmt(ARRDELAY) ONTIME_S$DEPDELAY <- delayCategory_fmt(DEPDELAY) ONTIME_S$DISTANCE_ZSCORE <- zscore(DISTANCE)
Oracle Database 12cリリース1 (12.1)の埋込みRエンジンによって、Rユーザーは、データベースやデータベース駆動型のデータの並列性で利用可能な計算のような、より多くのリソースを必要とするデスクトップの計算をオフロードできます。埋込みRエンジンは、SQLまたはPL/SQLプログラムに埋め込まれたRスクリプトも実行します(完全自動処理)。
次の例は、CRANからダウンロードした標準RパッケージとともにOracle R Enterprise埋込みRエンジンを使用する方法を示しています。
この例は、CRANパッケージを使用した回帰モデルの構築方法を示しています。データベース内のトレーニングに使用するデータを準備し(不要な観測データをフィルタで除外し、属性を選択し、欠落している値を帰属させるなど)、表ONTIME_S_PREPROCESSED_SUBSETを作成します準備したトレーニング・セット(通常、デスクトップのRメモリーに収まる大きさ)をRクライアントにプルし、モデルの構築を実行します。結果のモデルは、データベース内の膨大な数の行を並列してスコアリングするために使用されます。
1つの行を他の行から独立して、並列してスコアリングできるため、スコアリングは、簡単に並列処理できる操作です。デスクトップで構築されたモデルは、データベースに送られ、データベース内で膨大な数の行に対してスコアリングを実行します。
計算は、次のステップに分かれています。
この例は、R計算をオフロードし、埋込みRエンジンを実行する方法を示しています。Rユーザーは、単に、彼のコードを閉包(つまり、function() {}
)内に含め、ore.doEval()
を起動します。ore.doEval()
によって、そのRコードのデータベース埋込みRエンジンでの実行がスケジュールされ、結果が、その後の分析のためにデスクトップに返されます。
mod <- ore.doEval( function() { library(biglm) dat <- ore.pull(ONTIME_S) mod <- biglm(ARRDELAY ~ DISTANCE + DEPDELAY, dat) mod }); print(mod) mod=ore.pull(mod) print(mod)
この例は、CRANパッケージを使用した一連の回帰モデルの構築におけるデータベース駆動型のデータの並列性を示しています。ファクタの一意の値ごとに1つのモデルが構築されます。データベースによるオーケストレーションの下に、1つのファクタに1つずつのモデルが並列かつ同時に構築され、構築されたすべてのモデルのリストが、その後の分析のためにユーザーのデスクトップに送信されます。
modList <- ore.groupApply( # Organize input to the R script – This is always an Oracle R Enterprise # data frame X=ONTIME_S, # Specify the grouping column. Here we request one model per unique value of # ONTIME_S$DEST INDEX=ONTIME_S$DEST, # Model building code goes inside the closure. Input and grouping # conditions can be referenced as parameters to the function function(x, param) { library(biglm) biglm(ARRDELAY ~ DISTANCE + DEPDELAY, x) }); modList_local <- ore.pull(modList) # Print the model for just one destination - BOSTON summary(modList_local$BOS)
これらの関数は、よりリッチな統計分析を可能にするために使用できます。各関数の使用例は、「Oracle R Enterpriseの例」で説明するOracle R Enterpriseのサンプル・ライブラリを参照してください。これらの関数は、すべてOracle R Enterpriseのデータ・フレームに対して処理を実行します。
ore.summary
: 強力な列の複数集計を可能にします。
ore.rank
: 複数列にわたる柔軟なランキングを可能にします。
ore.sort
: 1つ以上の列に沿った柔軟なソートを可能にします。
ore.corr
: 数値列の相関分析を可能にします。
ore.crosstab
: 列間の分析を可能にします。
ore.freq
: 数値列のクロス集計の分析を可能にします。
Rモデルのore.predictにより、データベースに格納されているデータとRモデルを使用して予測を実行できます。
SQL問合せを介してRコードを実行できるOracle R Enterpriseユーザーには、RQROLEロールを付与する必要があります。
データベースでのRスクリプトの実行(完全自動処理)を可能にするため、Oracle R Enterpriseは、SQLでore.doEval()
、ore.groupApply()
およびore.indexApply()
のバリアントを提供しています。(ore.doEval()
、ore.groupApply()
およびore.indexApply()
は、「Oracle R Enterpriseのデータベース埋込みRエンジン」で説明します。)
SQL関数は、次のとおりです。
rqTableEval()
rqEval()
rqRowEval()
rqGroupEval()関数もコーディングできます。
rq*:Eval()
関数の構文は同じです。
rq*Eval( cursor(select * from table-1, cursor(select * from table-2, 'select <column list> from table-3 t', <grouping col-name from table-1 or num_rows>, 'function(x,param) { registered-R-code ] ')
説明:
最初のカーソルは入力カーソルです。入力は、4番目のパラメータに記述されているR閉包に、表全体、グループまたは1つの行として一度に渡されます。
2番目のカーソルは、パラメータ・カーソルです。1つの値を渡せます(つまり、実装するモデルの集まり)。
問合せによって、出力表の定義が指定されます。このパラメータがNULLである場合、出力はBLOBです。出力はXMLにすることもできます。
grouping col-name
は、オプションです。これはグループ化列の名前を提供します。
num_rows
は、オプションです。これは関数に一度に提供する行の数を提供します。
registeredR-code
は、実行するR関数の登録済バージョンです。詳細は、「Rスクリプトの登録」を参照してください。
次の例は、これらの関数の使用方法を示しています。
この例では、表fish
のすべての行を、他のパラメータを取らず、すべての入力データおよび値のROWSUMを含むoutput
を生成するR関数への入力として使用します。
input(x)
とそのR関数のパラメータ(param
)の両方がオプションであることに注意してください。
select * from table(rqTableEval( cursor(select * from fish), NULL, 'select t.*, 1 rowsum from fish t', 'function(x, param) { dat <- data.frame(x, stringsAsFactors=F) cbind(dat, ROWSUM = apply(dat,1,sum)) }'));
この例は、表fish
からR関数にn=1(4番目のパラメータ)行を一度に渡す方法を示しています。この関数にパラメータは必要ありません。この関数によって、出力においてfish
に別の列として追加されるROWSUMが生成されます。
select * from table(rqRowEval( cursor(select * from fish), NULL, 'select t.*, 1 rowsum from fish t', 1, 'function(x, param) { dat <- data.frame(x, stringsAsFactors=F) cbind(dat, ROWSUM = apply(dat,1,sum)+10) }'));
rqGroupEval
()関数に該当するものはありません。データおよびグループ化列に基づいてrqGroupEval
()のプライベート・バージョンを定義する必要があります。これは、表関数インフラストラクチャの制約です。
ONTIME_Sサンプル・データに基づいた例を次に示します。データ・カーソルはすべてのデータを使用しますが、PL/SQLレコードを使用していくつかの列を使用するカーソルを定義することもできます。次に、特定のデータ・カーソルに対して使用する予定のグループ化列の数と同じ数の表関数を定義する必要があります。
CREATE PACKAGE ontimePkg AS TYPE cur IS REF CURSOR RETURN ontime_s%ROWTYPE; END ontimePkg; / CREATE FUNCTION ontimeGroupEval( inp_cur ontimePkg.cur, par_cur SYS_REFCURSOR, out_qry VARCHAR2, grp_col VARCHAR2, exp_txt CLOB) RETURN SYS.AnyDataSet PIPELINED PARALLEL_ENABLE (PARTITION inp_cur BY HASH (month)) CLUSTER inp_cur BY (month) USING rqGroupEvalImpl; /
この時点では、1つのグループ化列のみがサポートされています。複数の列がある場合、それらの列を1つの列に結合して、その新しい列をグループ化列として使用します。PARALLEL_ENABLE句はオプションですが、CLUSTER BYは違います。
セキュリティ上の理由により、最初にシステムで一意の名前でRスクリプトを登録し、rq*Eval
表関数へのコールにおいて実際のスクリプトのかわりに新しい名前を使用する必要があります。
スクリプトおよびスクリプトをリストするビューを作成および削除する管理関数が次のように2つあります。
sys.rqScriptCreate
sys.rqScriptDrop
sys.rq_scripts
ビューによって、作成したスクリプトをリストおよび使用できます
「スクリプトの作成および使用に必要なロール」の説明のように、スクリプトおよびビューには、権限付与が必要です。
次に、スクリプトの登録方法および登録済スクリプトの使用方法の例を示します。
begin sys.rqScriptCreate('tmrqfun2', 'function() { ID <- 1:10 res <- data.frame(ID = ID, RES = ID / 100) res }'); end; / select * from table(rqEval( NULL, 'select 1 id, 1 res from dual', 'tmrqfun2')); begin sys.rqScriptDrop('tmrqfun2'); end;
sys.rqScriptCreate
およびsys.rqScriptDrop
を実行するには、管理ロールRQADMINを付与されている必要があります。
RQROLEロールには、sys.rq_scripts
ビューのSELECT権限が付与されています。
サーバーをインストールするときにRQADMINおよびRQROLEロールが作成されます。「管理ロール」を参照してください。
Oracle R Enterpriseには、Oracle R Enterpriseの使用方法を示す一連の例が同梱されています。これらの例は、自己完結型Rスクリプトの集まりです。
大部分のサンプル・プログラムでは、Rディストリビューションに含まれているデータ・フレームiris
が使用されます。iris
は、「表へのデータ・フレームのロード」の説明に従って表にロードされています。
この項の残りの部分では、2つの例について詳しく説明し、すべての例のリストを示します。
Rデータ・フレームをデータベース表にロードするには、次の手順に従います。
Rを起動し、library(ORE)を使用してOREパッケージをロードし、データベースに接続します。Rprofileが使用可能である場合は、後半の手順は自動です。
これらの例の大部分では、Rデータ・フレームiris
が使用されます。irisはRに同梱されています。Rコマンドclass
を使用してiris
がRデータ・フレームであること確認します。
R> class(iris) [1] "data.frame"
iris
は、植物のアヤメの各部の測定値で構成されています。Rコマンドhead
を使用して、iris
のデータの少量のサンプルを表示します。
R> head(iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa
ここで、接続しているデータベースに、データ・フレームiris
をロードします。
これらの例では、iris
のデータベース表バージョンには、IRIS_TABLEという名前が付けられています。IRIS_TABLEを削除し、接続しているスキーマにこの名前の表がないことを確認します。
ore.drop(table = "IRIS_TABLE")
IRIS_TABLEが存在しない場合、メッセージは表示されません。
ここで、iris
に含まれているデータでデータベース表を作成します。
ore.create(iris, table = "IRIS_TABLE")
ore.ls()
を使用して、表が作成されたことを確認します。
R> ore.ls() [1] "IRIS_TABLE" "NARROW" "ONTIME_S"
IRIS_TABLEは、データベースに格納されている表であり、R側のメタデータのみが含まれています。
R> class(IRIS_TABLE) [1] "ore.frame" attr(,"package") [1] "OREbase"
head
を使用して、IRIS_TABLE内の列名および最初の数個の値を表示します。
R> head(IRIS_TABLE) SEPAL_LENGTH SEPAL_WIDTH PETAL_LENGTH PETAL_WIDTH SPECIES 0 5.1 3.5 1.4 0.2 setosa 1 4.9 3.0 1.4 0.2 setosa 2 4.7 3.2 1.3 0.2 setosa 3 4.6 3.1 1.5 0.2 setosa 4 5.0 3.6 1.4 0.2 setosa 5 5.4 3.9 1.7 0.4 setosa
modeを使用して、列SPECIESのデータ型を表示します。
mode(IRIS_TABLE$SPECIES) [1] "raw"
いくつかのアルゴリズムは、データはすべて数値である場合にのみ機能します。次の手順に従って、非数値列SPECIESを含まない表IRIS_TABLE_Nを作成します。
IRIS_TABLE_N=IRIS_TABLE[,c("SEPAL_LENGTH", "SEPAL_WIDTH", "PETAL_LENGTH", "PETAL_WIDTH")]
R関数を使用して、表のデータを分析します。次に、例basic.R
からの単純な例をいくつか示します。
unique
を使用して、列内の一意のエントリのリストを取得します。この例では、一意のSPECIESを見つけます。
R> unique(IRIS_TABLE$SPECIES) [1] setosa versicolor virginica Levels: setosa versicolor virginica
PETAL_LENGTHの最小値、最大値、および平均を見つけます。
R> min(IRIS_TABLE$PETAL_LENGTH) [1] 1 R> max(IRIS_TABLE$PETAL_LENGTH) [1] 6.9 R> mean(IRIS_TABLE$PETAL_LENGTH) [1] 3.758
R関数の情報が必要な場合は、コマンドhelp(function-name)
を使用します。
サンプルnull.R
は、データとしてiris
を使用しない唯一のサンプルです。null.R
は、SQLでのNULLの処理とRでのNAの処理を比較します。
Rでは、NAは、欠落値インジケータを含む長さ1の論理定数です。データベースでは、NULLは、1つの行の1つの列における1つの値の欠落を示します。NULLは、データがない、不明である、または適切でないことを示します。
次の手順に従って、サンプルを実行します。
この例では、データ・フレームairquality
を使用します。データ・セットがデータ・フレームであり、そのデータ・フレームの数行を調べていることを確認します。
R> class(airquality) [1] "data.frame" R> head(airquality) Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 NA NA 14.3 56 5 5 6 28 NA 14.9 66 5 6
airquality
をAIRQUALITYとしてデータベースにロードします。
ore.drop(table = "AIRQUALITY") ore.create(airquality, table = "AIRQUALITY")
ore.ls()
を使用して、表が作成されたことを確認します。必要であれば、class(AIRQUALITY)
を使用して、AIRQUALITY
が、データベースに格納されている表であり、R側のメタデータのみが含まれていることを確認します。
RによってNAがどのように処理されるのかを確認します。オゾンが30未満のすべての観測データを返します。
R> nrow(airquality[airquality$Ozone < 30,])[1] 92
これを、NAを明示的に除外したときの結果と比較します。
R> nrow(airquality[airquality$Ozone < 30 & !is.na(airquality$Ozone),]) [1] 55
SQL表のデフォルトの動作は、出力でNULLを除外することです。
nrow(AIRQUALITY[AIRQUALITY$OZONE < 30,]) [1] 55
NULLを、RでのNAの処理と同じように処理するには、その動作を明示的に要求します。
options(ore.na.extract = TRUE) nrow(AIRQUALITY[AIRQUALITY$OZONE < 30,]) [1] 92
これらのスクリプトは、OREパッケージにデモとして追加されています。
これらの完全なリストにアクセスするには、次のように入力します。
R> demo(package = "ORE")
これらのスクリプトの1つを実行するには、demo
ファンクション・コールにそのデモの名前を指定します。たとえば、aggregate.R
を実行するには、次のように入力します。
R> demo("aggregate", package = "ORE")
Oracle R Enterpriseに同梱されている例は、次のとおりです。
table_apply.R Execute R code on all rows of a table passed in at once aggregate.R Demonstrates aggregations. See also summary.R analysis.R Demonstrates basic analysis and data processing operations basic.R Demonstrates basic connectivity to database binning.R Demonstrates binning in R columnfns.R Demonstrates use of column functions corr.R Correlation matrix (Pearson's, Spearman/Kendalls) crosstab.R Frequency cross-tabulations. Also see freq.R derived.R Handling derived columns distributions.R Distribution, Density, and Quantile Functions doEval.R Demonstrates support for database-enabled parallel simulations freqanalysis.R Frequency cross-tabulations. Also see crosstab.R graphics.R Demonstrates visual analysis (boxplot, histogram) group_apply.R Execute R code for different sets of rows, one set per group hypothesis.R Hypothesis Testing Functions(binomial, chi square, T test, etc.) matrix.R Matrix operations nulls.R Demonstrates handling of nulls in SQL vs. NAs in R push_pull.R Demonstrates collaborative processing between database and client rank.R Ranking of observations (ranking, handling ties, etc.) reg.R Multivariate Regression row_apply.R Execute R code on each row sql_like.R Demonstrates how R commands map to SQL operations stepwise.R Stepwise Multivariate Regression summary.R Demonstrates summary functionality