gpt4 book ai didi

r - 如何在R中批量查询Id的数量

转载 作者:行者123 更新时间:2023-12-02 20:02:47 24 4
gpt4 key购买 nike

下面我提到了 R 中的数据框。

ID       Amount     Date
IK-1 100 2020-01-01
IK-2 110 2020-01-02
IK-3 120 2020-01-03
IK-4 109 2020-01-03
IK-5 104 2020-01-03

我使用 ID 使用以下代码从 MySQL 获取一些详细信息。

library(RMySQL)

conn<- connection

query<-paste0("SELECT c.ID,e.Parameters, d.status
FROM Table1 c
left outer join Table2 d ON d.seq_id=c.ID
LEFT outer JOIN Table3 e ON e.role_id=d.role
where c.ID IN (", paste(shQuote(dataframe$ID, type = "sh"),
collapse = ', '),")
and e.Parameters in
('Section1',
'Section2','Section3',
'Section4');")

res1 <- dbGetQuery(conn,query)

res2<-res1[res1$Parameters=="Section1",4:5]
colnames(res2)[colnames(res2)=="status"] <- "Section1_Status"

上面的代码工作正常,如果我传递 ~1000 个 ID,但一次传递 10000 个或更多 ID 时会抛出 R 终止错误。

如何创建一个循环并批量传递 Id 以获得 10000 个 ID 的最终输出。

错误消息:

Warning message:
In dbFetch(rs, n = n, ...) : error while fetching rows

最佳答案

在 SQL 查询之前将 ID 的数据帧传递到临时表中,然后使用它来内连接您正在使用的 ID,这样就可以避免循环。您所要做的就是使用dbWriteTable并在调用它时设置参数temporary = TRUE

例如:

library(DBI)
library(RMySQL)
con <- dbConnect(RMySQL::MySQL(), user='user',
password='password', dbname='database_name', host='host')
#here we write the table into the DB and then declare it as temporary
dbWriteTable(conn = con, value = dataframe, name = "id_frame", temporary = T)
res1 <- dbGetQuery(con = conn, "SELECT c.ID,e.Parameters, d.status
FROM Table1 c
left outer join Table2 d ON d.seq_id=c.ID
LEFT outer JOIN Table3 e ON e.role_id=d.role
Inner join id_frame idf on idf.ID = c.ID
and e.Parameters in
('Section1',
'Section2','Section3',
'Section4');")

这应该会提高代码的性能,并且您不再需要使用 where 语句在 R 中循环。如果无法正常工作请告诉我。

关于r - 如何在R中批量查询Id的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60035473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com