私は手がかりを知っていますRで2つのcsvファイルを内部的にリンクする方法マージオプションがありますが、望ましくありません。 2つのCSVデータファイルがあります。 SQL、Rなどのクエリをどのように処理するかを心配しています。主キーは2つのCSVファイルですdata_id
。見つからないIDは(etc.)data.csv
にあります。log.csv
4
data_id, event_value
1, 777
1, 666
2, 111
4, 123
3, 324
1, 245
log.csv
熱に重複がないがID
重複がある場合name
data_id, name
1, leo
2, leopold
3, lorem
PostgreSQL構文の一部の類似コード
- 許す
data_id=1
name
とは別に合計を表示します。event_value
data.csv
log.csv
PostgreSQL部分選択に似た類似コード
SELECT name, event_value
FROM data, log
WHERE data_id=1;
期待される出力
leo, 777
leo, 666
leo, 245
Rメソッド
file1 <- read.table("file1.csv", col.names=c("data_id", "event_value"))
file2 <- read.table("file2.csv", col.names=c("data_id", "name"))
# TODO here something like the SQL query
# http://stackoverflow.com/a/1307824/54964
sqldf
ここで十分だろうと考えられる可能な方法
sqldf
data.table
dplyr
CSVファイルで実行したいことを示すPostgreSQLスキーマのようなコード
CREATE TABLE data (
data_id SERIAL PRIMARY KEY NOT NULL,
event_value INTEGER NOT NULL
);
CREATE TABLE log (
data_id SERIAL PRIMARY KEY NOT NULL,
name INTEGER NOT NULL
);
R:3.3.3
OS:Debian 8.7
関連:関連スレッドのPostgreSQLメソッドPostgreSQLで2つのCSVファイル/...を使用してSELECTを実行するには?
ベストアンサー1
RにはSQLレベルの利便性を備えた多くのパッケージがあります。最も便利なパッケージは
dplyr(現代的で基本的な機能よりも10〜100倍速い場合が多い)には、グループ別や個々の結合などのSQLに触発されたコマンドがあります。
SparkR(Sparkサポートが必要な場合はここにはありませんが、優れたSQL便利なコマンドが付属しています)や、グループ別や個別の結合などのSQLに触発されたコマンド
data-table
read.csv
に置き換えるなど、基本機能よりも効率的な機能を提供しますfread
。SQLDFは非常に信頼できず、非効率的であり、上記の失敗したRstudioのような優先順位エラーは致命的なエラーを引き起こす可能性があります。
これらのパッケージは、SQLを学習してデバッグする方法を教えてくれません。 SQLDFは確かに適切なSQLを学習するのに最も便利なツールではありません。 SQL Server Management Studio(Windows)は使いやすくなります(たとえば、Azure Basic SQL DB、月5€、または無料評価)。ここまたは他のデータベース - または直接設定
- コマンドソース postgres データベースを使用した
src_postgres()
R のデータベースコマンドの詳細ここ
以下に、正しいSQLを示し、コード例で発生したエラーを修正するデモを示します。また、SQLの便利なコマンドも示しています。 Rパッケージで何を見つけるべきかを知るために、まずSQLを正しく学ぶのが最善です。
デモ
コード4は無効な優先順位のため失敗します。 where句とUSINGは結合の後に来なければなりません。
> file1 <- read.csv("test1.csv", header=TRUE, sep=",") > file2 <- read.csv("test2.csv", header=TRUE, sep=",") > sqldf("SELECT event_value, name + FROM file1 + LEFT JOIN + (SELECT data_id, name + FROM file2 + WHERE data_id = 1) + USING(data_id) + WHERE data_id = 1") event_value name 1 777 leo 2 666 leo 3 245 leo
他の方法は次のとおりです。
正しいLEFT-JOINメソッド
> df3 <- sqldf("SELECT event_value, name + FROM file1 a + LEFT JOIN file2 b ON a.data_id=b.data_id") > > df3 event_value name 1 777 leo 2 666 leo 3 111 leopold 4 123 <NA> 5 324 lorem 6 245 leo > df3 <- sqldf("SELECT a.event_value, b.name + FROM file1 a + LEFT JOIN file2 b ON a.data_id=b.data_id + WHERE a.data_id = 1") > df3 event_value name 1 777 leo 2 666 leo 3 245 leo
Where条件を使用したテーブルのマージ
> df4 <- sqldf("SELECT a.event_value, b.name + FROM file1 a, file2 b + WHERE a.data_id = 1 + AND a.data_id=b.data_id") > > df4 event_value name 1 777 leo 2 666 leo 3 245 leo
SQLサブクエリ方法
> df5 <- sqldf("SELECT a.event_value, b.name + FROM + (SELECT data_id, event_value FROM file1) a, + (SELECT data_id, name FROM file2) b + WHERE a.data_id = 1 + AND a.data_id=b.data_id") > df5 a.event_value b.name 1 777 leo 2 666 leo 3 245 leo
RでSQLを使用する便利な方法は何ですか?
SQLスタイルの結合
build_sql SQLスタイルコマンドを実行するための便利な関数
Case-When関数はSQL-CASE-WHENからインスピレーションを得ました。
- SQL-COALESCEからインスピレーションを得たマージ機能
translate_sqlはR関数をSQLに変換するのに役立ちます(詳細はここ)
# Many functions have slightly different names translate_sql(x == 1 && (y < 2 || z > 3)) #> <SQL> "x" = 1.0 AND ("y" < 2.0 OR "z" > 3.0) translate_sql(x ^ 2 < 10) #> <SQL> POWER("x", 2.0) < 10.0 translate_sql(x %% 2 == 10) #> <SQL> "x" % 2.0 = 10.0
SQLLiteとdplyr:sqliteパッケージをインストールし、dplyrを使用してNYCデータセットを試してください。ここ
SparkRパッケージ
SQLスタイルの結合(内部結合、左結合など)とグループ化基準。もっとここ。