【问题标题】:R: Get vector of JSON strings from dataframe columns (row-by-row)R:从数据框列中获取 JSON 字符串的向量(逐行)
【发布时间】:2021-02-01 10:25:24
【问题描述】:

我想为数据帧的每一行创建一个数据帧列的 JSON 字符串(即获取 Json 字符串向量)。即我想从这段代码中复制这个输出,但使用更高效的代码(因为我的非玩具数据帧的速度非常糟糕):

apply(mtcars, 1, function(x) jsonlite::toJSON(as.list(x), na = "null", auto_unbox = TRUE))

运行以下代码很快,但我不确定如何操作以获得与上述代码相同的格式。

jsonlite::toJSON(mtcars, dataframe = "rows", pretty=FALSE, na = "null", auto_unbox = TRUE, na = "null")

所需输出示例:

马自达 RX4 "{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.62,"qsec":16.46,"vs":0, “上午”:1,“齿轮”:4,“碳水化合物”:4}” > 马自达 RX4 Wag
"{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.875,"qsec":17.02,"vs":0, "am":1,"gear":4,"carb":4}"

达特桑 710
"{"mpg":22.8,"cyl":4,"disp":108,"hp":93,"drat":3.85,"wt":2.32,"qsec":18.61,"vs":1, "am":1,"gear":4,"carb":1}"

【问题讨论】:

    标签: r json


    【解决方案1】:

    试试这个

    df_to_json_vec <- function(df) {
      # `collapse = FALSE` is the key.
      jsonlite::toJSON(df, dataframe = "rows", na = "null", auto_unbox = TRUE, collapse = FALSE)
    }
    `names<-`(df_to_json_vec(`row.names<-`(df, NULL)), row.names(df))
    

    性能基准

    # create a dataframe ten times the length of mtcars
    df <- dplyr::bind_rows(replicate(10, mtcars, simplify = FALSE))
    microbenchmark::microbenchmark(
      `names<-`(df_to_json_vec(`row.names<-`(df, NULL)), row.names(df)), 
      apply(df, 1, function(x) jsonlite::toJSON(as.list(x), na = "null", auto_unbox = TRUE)), 
      unit = "ms"
    )
    

    结果

    Unit: milliseconds
                                                                                                    expr      min        lq     mean   median        uq      max neval cld
                               res1 <- `names<-`(df_to_json_vec(`row.names<-`(df, NULL)), row.names(df))   1.3687   1.47295   1.6430   1.5700   1.75415   2.7115   100  a 
     res2 <- apply(df, 1, function(x) jsonlite::toJSON(as.list(x),      na = "null", auto_unbox = TRUE)) 206.9659 223.43650 234.2259 230.8466 241.79225 343.3378   100   b
    

    此外,新代码产生的结果集与旧代码相同。

    > all(res1 == res2)
    [1] TRUE
    

    【讨论】:

    • 谢谢!如果您不介意,我有两个问题; 1)。您用来分配名称的方法的名称(或引用)是什么,即代码:row.names&lt;-(df, NULL))? 2)你怎么知道使用崩溃?它没有出现在?jsonlite::toJSON 或小插图中(除非我当然错过了......)。
    • @user1420372 1) row.names&lt;- 是我使用的方法。您可以查看此post 以获得更多解释(此帖子是针对另一个功能levels&lt;-,但row.names&lt;-levels&lt;- 具有相同的功能,正如您可以从它们的名称中看出的那样)。 2)通过在Github上挖掘其source codejsonlite::toJSON调用内部函数jsonlite:::asJSON
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 2017-02-20
    • 2020-08-07
    • 2021-05-14
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多