1

MySQL クエリを Python スクリプトから R の類似のクエリに変換したいと考えています。Python はループ構造を使用して、ゲノム座標を使用して特定の値を検索します。

SQL = """SELECT value FROM %s FORCE INDEX (chrs) FORCE INDEX (sites)
                        WHERE `chrom` = %d AND `site` = %d""" % (Table, Chr, Start)
cur.execute(SQL)

Rでは、染色体とサイトはデータフレーム内にあり、データフレーム内のすべての行に対して、単一の値を抽出してデータフレーム内の新しい列に追加したいと考えています

したがって、現在のデータフレームは次のような構造になっています。

df <- data.frame("Chr"=c(1,1,3,5,5), "Site"=c(100, 200, 400, 100, 300))

修正されたデータフレームには、データベースからの値を含む追加の列が必要です (対応するゲノム座標で。構造は次のようになります。

df <- data.frame("Chr"=c(1,1,3,5,5), "Site"=c(100, 200, 400, 100, 300), "Value"=c(1.5, 0, 5, 60, 100)

これまでのところ、次を使用してデータベースに接続しました。

con <- dbConnect(MySQL(),
                 user="root", password="",
                 dbname="MyDataBase")

データフレームの各行をループするのではなく、対応する値を既存のデータフレームの新しい列に追加するものを使用したいと思います。

以下の回答に基づいて、実用的なソリューションで更新してください。

library(RMySQL)
con <- dbConnect(MySQL(),
                 user="root", password="",
                 dbname="MyDataBase")

GetValue <- function(DataFrame, Table){
  queries <- sprintf("SELECT value as value 
                     FROM %s FORCE INDEX (chrs) FORCE INDEX (sites) 
                     WHERE chrom = %d AND site = %d UNION ALL SELECT 'NA' LIMIT 1", Table, DataFrame$Chr, DataFrame$start)
  res <- ldply(queries, function(query) { dbGetQuery(con, query)})
  DataFrame[, Table] <- res$value
  return(DataFrame)
}
df <- GetValue(df, "TableName")
4

4 に答える 4

0

RMySQLまたはsqldfパッケージを使用しないのはなぜですか?

RMySQLを使用すると、R で MySQL にアクセスできます。

sqldfを使用すると、R データ構造に対して SQL クエリを発行できます。

これらのいずれかを使用すると、同じ結果を得るために SQL クエリを言い換える必要はありません。

また、 data.tableパッケージについても触れておきます。これを使用すると、データ フレームをデータ テーブルに変換した後、非常に効率的な選択と結合を行うことができますas.data.table(your.data.frame)。もう 1 つの良い点は、data.table オブジェクトが同時に data.frame であるため、データ フレームで機能するすべての関数がこれらの変換されたオブジェクトでも機能することです。

于 2014-08-03T11:15:37.277 に答える
0

dplyrパッケージを簡単に使用できます。それについての素晴らしいビネットもあります- http://cran.rstudio.com/web/packages/dplyr/vignettes/databases.html

知っておくべきことの1つは次のとおりです。

RMySQL パッケージによって仲介される src_mysql() を介して、MySQL および MariaDB (MySQL の最近のフォーク) に接続できます。PostgreSQL と同様に、データベース名、ユーザー名、パスワード、ホスト、およびポートを指定する必要があります。

于 2014-08-05T14:15:36.317 に答える