我需要一个更好的主意来解决RMySQL
。
我有一个存储在MySQL服务器中的数据帧myTable
。每行代表一个客户的订单,并包含客户名称,订单ID,日期等。
我的工作环境是R
。每次我处理此表时,都使用RMySQL
包调用数据。但是我永远不会调用全部数据,因为它太大而无法解决。相反,我使用如下语句过滤所需的数据:
db <- with(connectionDb, dbConnect(MySQL(),
user = user,
password= password,
dbname = dbname,
host = host))
# connectionDb returns user, password, dbname, host from our credential file.
dbSendQuery(conn = db, 'set character set "utf8"')
cond <- paste('SELECT * FROM myTable
WHERE organisation LIKE "Ikea"
AND dateA >= "2018-05-01" AND dateA < "2018-06-01"')
export <- dbGetQuery(conn = db, statement = cond)
数据帧export
在R
中看起来像这样。
organisation Order_ID dateA dateB dateC dateD
Ikea a 2018-04-01 2018-05-07 2018-05-09 2018-05-01
Ikea a 2018-06-01 2018-05-03 2018-05-29 NA
Ikea a 2018-04-02 2018-05-01 2018-07-08 2018-05-26
Ikea b 2018-06-02 2018-05-01 NA 2018-05-26
Ikea b 2018-06-02 2018-05-01 NA 2018-05-26
Ikea b NA 2018-05-05 2018-08-02 2018-06-01
Ikea c 2018-06-01 2018-05-07 2018-05-09 2018-05-01
Ikea c 2018-06-01 2018-05-03 NA NA
Ikea c 2018-08-02 2018-05-09 2018-07-08 2018-05-26
但是现在,在MySQL服务器中存储的表中,我想添加一个新列Billed
,如果已经为订单付款,则为1,否则为0。因此结果应如下所示。
organisation Order_ID dateA dateB dateC dateD Billed
Ikea a 2018-04-01 2018-05-07 2018-05-09 2018-05-01 0
Ikea a 2018-06-01 2018-05-03 2018-05-29 NA 1
Ikea a 2018-04-02 2018-05-01 2018-07-08 2018-05-26 1
Ikea b 2018-06-02 2018-05-01 NA 2018-05-26 0
Ikea b 2018-06-02 2018-05-01 NA 2018-05-26 1
Ikea b NA 2018-05-05 2018-08-02 2018-06-01 0
Ikea c 2018-06-01 2018-05-07 2018-05-09 2018-05-01 1
Ikea c 2018-06-01 2018-05-03 NA NA 1
Ikea c 2018-08-02 2018-05-09 2018-07-08 2018-05-26 0
我有几个想法可以做到这一点,但是我不确定它们是否很好。
想法1:使用上面的查询调用表,在表R中添加新列,然后使用dbWriteTable
函数覆盖整个表。但是我担心覆盖整个表可能会更改原始数据的格式(str,lgl,numeric等)。
想法2:使用上面的查询调用一个表,创建一个只有billing
和Order_ID
列的新数据框Billed
,并在MySQL服务器中合并billing
和Tour_ID
的原始数据表。
无论哪种情况,我都不确定服务器中的原始数据表会发生什么,尤其是dbGetQuery
函数未获取的行。会为被覆盖的行创建一个新列Billed
并为0和1创建一个新列,对于其他行,它们是否全部为NA?
因此,我正在寻找更好,更稳定的想法来完成此任务。工作流程好吗?我应该使用哪种功能?
感谢您的帮助!