Rではデータフレームが主要な処理対象
Rではデータフレームというものが主要な処理対象となります。
データフレームのサンプル DF | |||
---|---|---|---|
社員番号 | 部署 | 氏名 | |
1 | 1 | 営業部 | 山田太郎 |
2 | 2 | 営業部 | 鈴木花子 |
3 | 3 | 総務部 | 杉本一郎 |
4 | 4 | 財務部 | 支払益子 |
5 | 5 | 経理部 | 会計主水 |
6 | 6 | 秘書室 | 白鳥麗子 |
これは行列のようにも見えますが、文字列や数値が混ざっていて列や行にラベルがあり、列ラベルは変数名となります、行ラベルは行番号です。ふつうはいろいろなデータベースからデータを取り込みRのデータフレームとしてから処理します。
R標準ではデータフレームをSQLで処理できない
R標準ではデータフレームとなってからはSQLで処理することはできず、データの抽出はsubset()、集計はaggregate()等で行えます。
subset(DF,DF[,1]==6,c(1,3,2))
社員番号 氏名 部署
1 6 白鳥麗子 秘書室
# 変数1(社員番号)=6 について 項目1(社員番号),3(氏名),2(部署) の順に出力
# Select 社員番号,氏名,部署 from DF where 社員番号=6 とでもできれば良いが…
これはこれで簡単なのですが、他の人が見た時にわかりにくいと思います。たとえば監査法人にソースコードを提出したとして、こんなコードが何をしているのかわかれと言っても困難でしょうし、私自身、後日見直したら理解に時間がかかりそうです。
それに、VisualBasic、VBA、VB.net、C++、RPGIII、SAS、SPSS・・・と使ってきて、その都度文法を使い分けるのも面倒になってきました。たいていの言語はなんらかの形でSQLを用いることができます。データフレームからSQLで抽出なり集計なりが出来れば、subset()やaggregate()に頼らなくてもよいですからわかりやすいです。各言語固有の文法を知らない人でもSQLさえ知っていれば理解できるのもありがたいです。なんとかRにおいてもSQLで処理できないものか。
データフレームをSQLで処理するライブラリ sqldf
SQLでデータフレームを処理するpackageがありました。sqldfです。 使い方も至ってシンプルです。データフレームを対象にして
sqldf( " SQL文 " )
とするだけです。事前にインストールし、library(sqldf)するまでは当然ですが。
上記サンプルのsubsetと同じ処理を sqldf() で実行してみます。
sqldf("select 社員番号,氏名,部署 from DF where 社員番号=6")
社員番号 氏名 部署
1 6 白鳥麗子 秘書室
データフレームからSQLによってデータを抽出できました。こちらの方が可読性が高いと思います。
結果は1行ですが、データフレームです。
sqldfはSQLite
sqldf ライブラリをロードすると RSQLite もロードされます。これはsqldfが RSQLite を利用しているからです。そのため select 以外のSQLも使えます。
たとえば、フィールド項目一覧を得るには SQLiteでは PRAGMA TABLE_INFO(テーブル名) としますから
sqldf("PRAGMA TABLE_INFO(DF)")
cid name type notnull dflt_value pk
1 0 社員番号 REAL 0 0
2 1 部署 TEXT 0 0
3 2 氏名 TEXT 0 0
のようにsqldfでも実行可能です。
注意
日本語列名だとエラーが起こることもある。全角4文字が目安?
ピリオド(.)で始まる列名も駄目。
Though dataframes are used very often,but once data is imported to R and translated to the dataframe ,there are few methods to extract data from R dataframes via SQL.
Here is one package named sqldf that enables us to extract data from R dataframes via SQL.
We can use sqldf very easily, only as follows.
library(sqldf)
sqldf( " SQL statement " )