2017-05-19 8 views
0

私はMongoDBからデータを引き出すためにRmongoパッケージを使用しています。R:Rmongo出力をデータフレームに変換する

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\"}" 

データフレームは、手動で使用して再作成することができます。

   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 

I:

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) 

私はこの出力をしたいと思いますより進歩を遂げようとしたdbGetQuery関数から直接cData列を出力するためにdクエリを実行しますが、私は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 
+0

貼り付けが簡単な例がありますか? –

+0

私はデータベースへのアクセスを提供することができないので、コピーしやすいdata.frameを追加しましたが、mongoDBを照会するステップでは再現できません。 –

+0

データベースにアクセスする必要はありません。 R部分を再現できれば十分です。 –

答えて

1

これは最善の方法ではないかもしれませんが、それはあなたを得るでしょう。アプローチでは、私はあなたが望むフォーマットにしているデータを変換しています。

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 
1

私はRMongoオーバーmongoliteパッケージをお勧めします。 mongoクエリを使用して、mongodbからデータフレームを取得することができます。配列を含むデータを照会する場合は、$ unwindを使用し、 "flatten"(flattenはjsonliteパッケージのもの)を使用する必要があります。

関連する問題