簡體   English   中英

R:將Rmongo輸出轉換為數據幀

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM