我正在使用DBI包将数据插入MySQL。这是代码:
ch <- DBI::dbConnect(MySQL())
dbSendQuery(ch, 'set character set "utf8"')
dbSendQuery(ch, 'SET NAMES utf8')
for (i in 1:nrow(test)) {
query <- paste0("INSERT INTO trade_data VALUES('0', '", test[i, 1], "', '",
test[i, 2], "', ", test[i, 3], "')")
dbSendQuery(ch, query)
}
问题出在3td列中,该列是数字,但具有NA
值。当循环到达具有NA
值的行时,它将返回错误:
.local(conn,statement,...)中的错误:无法运行语句: “字段列表”中的未知列“ NA”
我试图将NA更改为NaN,“ NULL”和其他一些类型,但是没有任何效果。如果我将NA更改为0,它将起作用。
答案 0 :(得分:0)
如果您愿意将NA更改为0,那么最好的选择是执行以下操作。
test[is.na(test)] <- 0
这会将data.frame test
中的所有NA替换为0。您可以执行相同操作,也可以将其更改为字符串'NULL'。
test[is.na(test)] <- 'NULL'
如果您只想替换一列,则可以执行以下操作:
test$col3[is.na(test$col3)] <- 0
答案 1 :(得分:0)
为运行SQL的R之类的任何应用程序层考虑参数化的编程行业标准。使用这种方法,可以避免字符串内插或混乱的引号括起来的任何需求。 R的DBI标准有几种方法,其中一种是sqlInterpolate
:
# PREPARED STATEMENT (NO DATA) QMARKS REQUIRED BUT NAMES CAN CHANGE
sql <- "INSERT INTO trade_data (Col1, Col2, Col3, col4)
VALUES (?param1, ?param2, ?param3, ?param4)"
ch <- DBI::dbConnect(MySQL())
dbSendQuery(ch, 'set character set "utf8"')
dbSendQuery(ch, 'SET NAMES utf8')
for (i in 1:nrow(test)) {
# BIND PARAMS
query <- sqlInterpolate(conn, sql, param1 = "0", param2 = test[i, 1],
param3 = test[i, 2], param4 = test[i, 3])
# EXECUTE QUERY
dbSendQuery(ch, query)
}
答案 2 :(得分:0)
我说对了。我必须将“”更改为“ NULL”,将NA更改为NULL,然后在插入中使用ifelse语句。像这样:
ch <- DBI::dbConnect(MySQL())
dbSendQuery(ch, 'set character set "utf8"')
dbSendQuery(ch, 'SET NAMES utf8')
test[test == ""] <- "NULL"
test[is.na(test)] <- "NULL"
for (i in 1:nrow(test)) {
query <- paste0("INSERT INTO trade_data VALUES('0', '", test[i, 1], "', ",
ifelse(test[i, 2] == "NULL", test[i, 2], paste0("'", test[i, 2], "'")), ", ",
ifelse(test[i, 3] == "NULL", test[i, 3], paste0("'", test[i, 3], "'")), ", ",
# test[i, 3],", ",
test[i, 4], ", ",
test[i, 5], ", ",
test[i, 6], ", ", test[i, 7] , ", ",
test[i, 8], ", ", test[i, 9] , ", ",
test[i, 10], ", ", test[i, 11] , ", '",
test[i, 12], "')")
dbSendQuery(ch, query)
}
DBI::dbDisconnect(ch)