2015-11-29 4 views
1

Вопросrmongodb - объединить два кадра данных в один документ в коллекции

Использование R и rmongodb, как создать MongoDB документ из двух кадров данных, второй из которых будет элемент массива из первый?

данных

Моя первая data.frame всегда одна строка. , например.

df_1 <- data.frame(myVar1 = 1, 
        myVar2 = 2, 
        myVar3 = 3) 

Моя вторая data.frame всегда одна или более строк например,

df_2 <- data.frame(arrVar1 = c(1,2), 
        arrVar2 = c(1,2)) 

Требуемое решение

моя цель состоит в том, чтобы иметь документ в коллекции, структурированную как:

# { 
# "_id" : ObjectId("565a939aa30fff2d67bfd492"), 
# "vars" : { 
# "myVar1" : 1.0000000000000000, 
# "myVar2" : 2.0000000000000000, 
# "myVar3" : 3.0000000000000000, 
# "myArr" : [ 
#  { 
#   "arrVar1" : 1, 
#   "arrVar2" : 1 
#   }, 
#   { 
#   "arrVar1" : 2, 
#   "arrVar2" : 2 
#   } 
#  ] 
# } 
# } 

Как я могу добиться этого?


Редактировать

(удалены все мои попытки)

спасибо Дмитрию за ответ и показывая мне, что структура мне нужно достигнуть.

Таким образом, я проверил несколько разных способов получения решения.

library(microbenchmark) 

fun_1 <- function(df){ 
    list(myArr = unname(split(df, seq(nrow(df))))) 
} 

fun_2 <- function(df){ 
    list('myArr' = Map(function(i, d) d[i, ], 
        seq_len(nrow(df)), 
        MoreArgs = list('d' = df) 
)) 
} 

fun_3 <- function(df){ 
    list(myArr = (lapply(as.list(1:dim(df)[1]), function(x) df[x[1],]))) 
} 

microbenchmark(fun_1(df_2), fun_2(df_2), fun_3(df_2), times = 1000) 


Unit: microseconds 
     expr  min  lq  mean median  uq  max neval 
fun_1(df_2) 162.135 176.7315 197.8129 187.7065 201.0385 1555.802 1000 
fun_2(df_2) 84.770 92.2840 102.3595 96.3135 108.8165 1441.410 1000 
fun_3(df_2) 85.052 93.8675 103.7496 97.9310 109.4090 1422.860 1000 

ответ

1

Здесь нет ничего особенного rmongodb. Как я писал везде: rmongodb будет преобразовывать неназванные списки в массивы и названные списки в объекты. Таким образом, вы просто должны преобразовать ваш второй data.frame в соответствующий список:

df2_transformed <- list('myArr' = Map(function(i, df) df[i, ], 
            seq_len(nrow(df_2)), 
            MoreArgs = list('df' = df_2) 
           )) 
df1_df2_comb <- c(df_1, df2_transformed) 
str(df1_df2_comb) 
mongo.insert(mongo, paste0(db,".",coll), df1_df2_comb) 

Вы можете использовать Map, lapply, mapply - зависит от ваших предпочтений.

+0

, когда вы говорите, что это кажется таким простым! – tospig