Error: Cannot pass NA to dbQuoteIdentifier()
另外:警告信息:
In field_types[] <- field_types[names(data)] :
number of items to replace is not a multiple of replacement length
这是我今天尝试使用sqldf包运行任何内容时出现的错误消息。昨天运行的相同查询今天没有运行,我做错了什么?
答案 0 :(得分:8)
我遇到了同样的问题:
Error: Cannot pass NA to dbQuoteIdentifier()
In addition: Warning message:
In field_types[] <- field_types[names(data)] :
number of items to replace is not a multiple of replacement length
经过一些研究,我注意到我在一个表中选择了两次相同的列:
table1<- sqldf("select columnA,
columnA,
keyA
from tableA")
table2<- sqldf("select columnB,
keyB
from tableB")
problematicMerge<- sqldf("select a.*,
b.*
from tableA a join
tableB
on a.keyA = b.keyB")
通过更改table1以删除重复列来解决这个问题(参见下文: - 我怀疑其中一个列的别名是否具有不同的名称也会起作用):
table1<-sqldf("select columnA,
keyA
from tableA")
希望这有帮助
答案 1 :(得分:1)
昨天我遇到了同样的问题,因为我突然无法将桌面从R上传到远程桌面上的SQLite数据库。
lghdb <- dbConnect(SQLite(), 'lgh.db'
dbWriteTable(lghdb, 'SrtrRisks', SrtrRisks)
Error: Cannot pass NA to dbQuoteIdentifier()...
在弄乱了一段时间之后,我意识到这个错误是由于被解决的SQLite数据库由于未完成(未提交)事务而被“锁定”,这与我使用SQLite浏览器的同时工作有关。一旦我提交了待处理的交易,问题就消失了。
我想你一定也想过这个,因为你的帖子没有跟进。 RSQLite人员可能会很高兴看到他们是否可以在这些情况下返回更有用的错误消息。
Larry Hunsicker
答案 2 :(得分:1)
我也遇到了同样的错误:
## step1: encountered the error as below while joining two tables
screens_temp_2 = sqldf("SELECT a.* , b.ue as 'sp_used_ue' , b.te as
'sp_used_te' from screens_temp a left outer join sp_temp b on
a.screen_name = b.screen_name ")
Error: Cannot pass NA to dbQuoteIdentifier()
In addition: Warning message:
In field_types[] <- field_types[names(data)] :
number of items to replace is not a multiple of replacement length
## step2: while checking the column names , this is what i found
colnames(screens_temp)
[1] "screen_name" "usv" "tsv" "20_ue" "20_te"
[6] "40_ue" "40_te" "60_ue" "60_te" "80_ue"
[11] "80_te" "100_ue" "100_te" "sp_load_ue" "sp_load_te"
[16] "sp_load_ue" "sp_load_te"
上面的结果显示sp_load_ue和sp_load_te重复。
## below i corrected the column names:
colnames(screens_temp) <- c("screen_name", "usv", "tsv", "20_ue", "20_te", "40_ue" , "40_te" , "60_ue" , "60_te" , "80_ue" , "80_te" ,"100_ue" , "100_te" , "sp_load_ue" , "sp_load_te" , "sp_used_ue" , "sp_used_te" )
write.table(screens_temp, "screens_temp_corrected.csv", row.names = FALSE ,col.names = TRUE, sep = ",")
## again i ran step 1, it worked fine.
注意:我认为sqldf中存在一个错误,因为它允许在将输出分配给数据帧时重复列名。它应该在将输出分配给数据帧时抛出错误/警告,以便用户可以适当地重命名列。
答案 3 :(得分:1)
在循环中遇到与sqldf相同的问题。通过将其放在data.frame call:data.frame(sqldf(..))。
中来解决它