2017-05-19 2 views
0

나는 Rongongo 패키지를 사용하여 MongoDB에서 데이터를 가져 왔습니다.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\"}" 

dataframe 수동으로 사용하여 재 작성 할 수 있습니다

   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) 

나는이 출력을 싶습니다 더 진전을 시도했다. d 쿼리를 사용하여 dbGetQuery 함수에서 직접 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 
+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 패키지에서 제공)을 사용해야합니다.