我想将 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")