当我运行查询时
mongo.cursor.to.data.frame(cursor)
使用rmongodb
将集合中的文档提取到R中的数据框,我收到了警告消息:
In mongo.cursor.to.data.frame(cursor) : This fails for most NoSQL data structures. I am working on a new solution
我查了一些关于rmongodb
的文章,我也可以在那里找到这条消息。此警告是否意味着结果数据框中可能存在某些问题?
答案 0 :(得分:0)
source code显示可能出现的问题
mongo.cursor.to.data.frame <- function(cursor, nullToNA=TRUE, ...){
warning("This fails for most NoSQL data structures. I am working on a new solution")
res <- data.frame()
while ( mongo.cursor.next(cursor) ){
val <- mongo.bson.to.list(mongo.cursor.value(cursor))
if( nullToNA == TRUE )
val[sapply(val, is.null)] <- NA
# remove mongo.oid -> data.frame can not deal with that!
val <- val[sapply(val, class) != 'mongo.oid']
res <- rbind.fill(res, as.data.frame(val, ... ))
}
return( as.data.frame(res) )
}
我们可以看到它正在使用plyr::rbind.fill
到rbind
data.frames。所以这一切都归结为传递给rbind.fill
的内容,即val
。
而val
是val <- mongo.bson.to.list(mongo.cursor.value(cursor))
的结果。
因此,只要as.data.frame(val, ...)
可以处理您传递给它的列表结构,就可以了。
然而,设想一个 NoSQL 数据结构会很容易失败:
## consider the JSON structure
## [{"a":[1,2,3],"b":["a","b","c"]},{"d":[1.1,2.2,3.3],"e":[["nested","list"]]}]
##Which in R is the same as
lst = list(list(a = c(1L,2L,3L),
b = c("a","b","c")),
list(d = c(1.1, 2.2, 3.3),
e = list(c("nested", "list"))))
## this errors when coerced to a data.frame
as.data.frame(lst)
Error in data.frame(d = c(1.1, 2.2, 3.3), e = list(c("nested", "list")), :
arguments imply differing number of rows: 3, 2
此时我应该提一下mongolite
包,这通常会更快,但会再次返回data.frame
。
还有我对mongolite的扩展,mongolitedt
(还没有在CRAN上)更快更好并且检索数据,但是再一次受限于结果必须被强制转换为data.table