[英]R: Convert Rmongo output to dataframe
我一直在使用Rmongo軟件包從MongoDB中提取數據。
library(Rmongo)
mongo <- mongoDbConnect("cmdbData", host="XX-MONGODB-02", port=27017)
data_users <- dbGetQuery(mongo, 'computers', '{}')
提取的數據如下所示:
update_bol key cData
1 delete NA "{ \"name\" : \"name1\" , \"domain\" : \"xx.yy.dk\"}"
2 update NA "{ \"name\" : \"name2\" , \"domain\" : \"xx.yy.dk\"}"
3 update NA "{ \"name\" : \"name3\" , \"domain\" : \"xx.yy.dk\"}"
4 update NA "{ \"name\" : \"null\" , \"domain\" : \"xx.yy.dk\"}"
5 update NA "{ \"name\" : \"name5\" , \"domain\" : \"zz.yy.dk\"}"
6 delete NA "{ \"name\" : \"name6\" , \"domain\" : \"zz.yy.dk\"}"
可以使用以下方法手動重新創建數據框:
data.frame(update_bol = c("delete", "update", "update", "update", "update", "delete"),
key = c(NA, NA, NA, NA, NA, NA),
cData = c("{ \"name\" : \"name1\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name2\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name3\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"null\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name5\" , \"domain\" : \"zz.yy.dk\"}", "{ \"name\" : \"name6\" , \"domain\" : \"zz.yy.dk\"}"), stringsAsFactors = FALSE)
我想要這個輸出:
name domain
1 name1 xx.yy.dk
2 name2 xx.yy.dk
3 name3 xx.yy.dk
4 NULL xx.yy.dk
5 name5 zz.yy.dk
6 name6 zz.yy.dk
我試圖進行更高級的查詢以直接從dbGetQuery-function輸出cData列,但是我是MongoDB的新手,並且似乎找不到合適的查詢。
cData的格式看起來像JSON,因此我也嘗試使用“ jsonlite”包提取列,但是我也無法使其工作。 你有什么建議嗎?
library(jsonlite)
library(tidyverse)
fromJSON(data_users$ciData[1]) %>% as.data.frame
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 1, 0
這可能不是最好的方法,但可以助您一臂之力。 在這種方法中,我正在將所需的數據轉換為所需的格式。
df<-data.frame(update_bol = c("delete", "update", "update", "update", "update", "delete"),
key = c(NA, NA, NA, NA, NA, NA),
cData = c("{ \"name\" : \"name1\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name2\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name3\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"null\" , \"domain\" : \"xx.yy.dk\"}", "{ \"name\" : \"name5\" , \"domain\" : \"zz.yy.dk\"}", "{ \"name\" : \"name6\" , \"domain\" : \"zz.yy.dk\"}"), stringsAsFactors = FALSE)
clean<-function(x){
cleand_x<-gsub(pattern = '[\\{\\}\\"]',replacement = "",x = df$cData,fixed=F)
cleand_x<-strsplit(cleand_x,split = " ")
final<-sapply(cleand_x,function(t)
{
c(name=t[[4]],domain=t[[8]])
},simplify = T)
return(as.data.frame(t(final)))
}
clean(df)
name domain
1 name1 xx.yy.dk
2 name2 xx.yy.dk
3 name3 xx.yy.dk
4 name4 xx.yy.dk
5 name5 zz.yy.dk
6 name6 zz.yy.dk
我建議在RMongo上使用mongolite軟件包。 您可以使用mongo查詢將數據從mongodb中拉入數據框。 如果要查詢包含數組的數據,則需要使用$ unwind並可能使用“ flatten”(flatten來自jsonlite包)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.