【问题标题】:Convert list derived from JSON to data.table or time series将从 JSON 派生的列表转换为 data.table 或时间序列
【发布时间】:2020-08-28 03:27:01
【问题描述】:

我有一个 .json 文件,我设法将它与 jsonlite 库一起加载(感谢这个论坛),但我无法将其转换为单个 data.table,之后我想将其转换为时间序列。这些是今年每天(2020-05-11 00:00,全天到 2020-01-01 00:00)的 101 种产品(例如地毯、地毯 b)的每日销售数据。

我想要一个日期列 (2020-01-01),然后是 101 列,每个产品一个列。

这里是 JSON 文件的一部分

{"results":{"carpeta":{"2020-05-11 00:00":25.18,"2020-05-10 00:00":21.30,"2020-05-09 00:00":18.65,...},"carpetb":{"2020-05-11 00:00":0.43,...}},"ts":"2020-05-11 14:08"}

我用

> library(jsonlite)
> sales <- fromJSON("sales.json")
> summary(sales)
        Length Class  Mode     
results 101    -none- list     
ts        1    -none- character

> summary(sales$results)
                          Length Class  Mode
carpeta                   133    -none- list
carpetb                   133    -none- list
...

> summary(sales$results$carpeta)
                 Length Class  Mode   
2020-05-11 00:00 1      -none- numeric
2020-05-10 00:00 1      -none- numeric

> str(sales$results$carpeta)
List of 133
 $ 2020-05-11 00:00: num 36.4
 $ 2020-05-10 00:00: num 44.7

现在我被困在 data.table 中,因为简单的 x

date       carpeta carpetb ...
2020-01-01  23.3    17.4
2020-01-02  12.7     5.4
...

【问题讨论】:

    标签: r json data.table


    【解决方案1】:

    试试下面的代码

    sales <- fromJSON("Test.json")
    A = sales %>% 
        tibble::as_tibble() %>% 
        tidyr::unnest_wider(results) %>% 
        t() %>% 
        as.data.frame() %>% 
        tibble::rownames_to_column() %>% 
    

    输出

               rowname               V1               V2
    1 2020-05-11 00:00            25.18             0.43
    2 2020-05-10 00:00             21.3             <NA>
    3 2020-05-09 00:00            18.65             <NA>
    4               ts 2020-05-11 14:08 2020-05-11 14:08
    

    解释

    这里,Test.json 包含您共享的数据位。然后我们将其转换为tibble。核心步骤是使用unnest_wider 来处理读入数据后列中包含的列表。接下来,我们对其进行转换,以便将行名作为带有日期的列。然后可以轻松重命名列,如果需要,您可以删除最后一行。

    这就是你的想法吗?

    【讨论】:

    • 关闭;它很好地创建了这 101 列,但日期显示为属性,而不是列。 &gt; str(A$V1) Factor w/ 113 levels " 0"," 0"," 0.0",..: 96 110 103 84 94 86 68 65 107 113 ... - attr(*, "names")= chr [1:133] "2020-05-11 00:00"
    • V1 是我的代码中的rownames 列时,请尝试as.Date(A$V1)。那样有用吗?也许您可以发布更完整的数据集?
    猜你喜欢
    • 2016-03-13
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多