【问题标题】:rmongodb - combine two data frames into one document in a collectionrmongodb - 将两个数据帧组合成一个集合中的一个文档
【发布时间】:2015-11-29 06:52:13
【问题描述】:

问题

使用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
#         }
#     ]
#   }  
# }

我怎样才能做到这一点?


编辑

(删除了我所有的尝试)

感谢 Dmitriy 的回答并向我展示了我需要实现的结构。

因此,我对几种不同的解决方案进行了基准测试。

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

【问题讨论】:

    标签: r rmongodb


    【解决方案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 - 取决于您的偏好。

    【讨论】:

    • 当你这么说的时候,它看起来很简单!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多