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")