Работа с глубоко вложенными списками из JSON - PullRequest
0 голосов
/ 15 января 2020

каждый!

Возникла проблема с глубоко вложенным списком, полученным из JSON ... поэтому предоставьте исходные данные → https://dropmefiles.com/luuhx Что мне нужно? Тиббл с:

«id» формирует элемент «data»

«total_with_discount» из элемента «data»

«name» из [["data"]] [ ["siteorder_status"]]

форма "id" [["data"]] [["Cart"]] [[. x]] [["id"]] (примечание: .x должен иметь отношение к индексам в векторах выше. Также обратите внимание, что некоторые df в списках элементов "Корзина" имеют размеры 0 x 0)

Как я пытался решить эту проблему

Причина modify_depth didn ' если у нас одинаковые имена элементов на разных уровнях списка, я попытался извлечь каждый список отдельно.

carts <- response %>% map("data") %>% map("Cart") %>% map(~ .x)

data <- map(data, ~ list_modify(., "Cart" = NULL)) %>%
  map(~ list_modify(., "siteorder_status" = NULL)) %>%
  map(~ list_modify(., "items" = NULL))

siteorder_status <- map(response, "data") %>% map("name") %>% flatten_chr()

И вот я застрял ?‍♂️

Есть ли более простое решение? И как мне работать с пустыми (dim 0x0) df в корзинах (извлекать / заполнять идентификаторы, такие как NA в запрашиваемой таблице)?

UPD: попытался воспроизвести простой пример моего вложенного списка:

<!-- language-all: lang-r -->

    l <- list(list(data = data.frame(id = sample(10000:99999, 5),
                                     shipment_date = sample(seq(as.Date("2019-12-01"), as.Date("2020-01-20"), by= "day"), 5),
                                     stringsAsFactors = F)),
              list(data = data.frame(id = sample(10000:99999, 5),
                                     shipment_date = sample(seq(as.Date("2019-12-01"), as.Date("2020-01-20"), by= "day"), 5),
                                     stringsAsFactors = F)), 
              list(data = data.frame(id = sample(10000:99999, 5),
                                     shipment_date = sample(seq(as.Date("2019-12-01"), as.Date("2020-01-20"), by= "day"), 5),
                                     stringsAsFactors = F)))

    order_status <- c("new", "merged", "shipped", "delivered", "cancelled", "returned")

    for(i in 1:3){
      l[[i]][["data"]][["siteorder_status"]] <- data.frame(id = sample(10:100, 5),
                                         name = sample(order_status, 5, replace = T), stringsAsFactors = F)
    }

    for(i in 1:3){
      for(j in 1:length(l[[i]][["data"]]$id))
        l[[i]][["data"]][["cart"]][[j]] <- data.frame(id = sample(1000:9999, 1),
                                                    date = sample(seq(as.Date("2019-12-01"), as.Date("2020-01-20"), by= "day"), 1),
                                                    fr = runif(1, 100, 10000), stringsAsFactors = F)
    }

    l[[sample(1:3, 1)]][["data"]][["cart"]][[sample(1:5, 1)]] <- data.frame()
    str(l)
    #> List of 3
    #>  $ :List of 1
    #>   ..$ data:'data.frame': 5 obs. of  4 variables:
    #>   .. ..$ id              : int [1:5] 53422 30856 67755 58928 76734
    #>   .. ..$ shipment_date   : Date[1:5], format: "2019-12-13" "2019-12-11" ...
    #>   .. ..$ siteorder_status:'data.frame':  5 obs. of  2 variables:
    #>   .. .. ..$ id  : int [1:5] 56 68 64 62 60
    #>   .. .. ..$ name: chr [1:5] "shipped" "shipped" "merged" "new" ...
    #>   .. ..$ cart            :List of 5
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 8676
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-15"
    #>   .. .. .. ..$ fr  : num 8953
    #>   .. .. ..$ :'data.frame':   0 obs. of  0 variables
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 6770
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-19"
    #>   .. .. .. ..$ fr  : num 9606
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 9602
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-08"
    #>   .. .. .. ..$ fr  : num 292
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 6683
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-30"
    #>   .. .. .. ..$ fr  : num 5728
    #>  $ :List of 1
    #>   ..$ data:'data.frame': 5 obs. of  4 variables:
    #>   .. ..$ id              : int [1:5] 54439 69536 22064 36821 24478
    #>   .. ..$ shipment_date   : Date[1:5], format: "2019-12-29" "2019-12-06" ...
    #>   .. ..$ siteorder_status:'data.frame':  5 obs. of  2 variables:
    #>   .. .. ..$ id  : int [1:5] 43 30 38 53 76
    #>   .. .. ..$ name: chr [1:5] "merged" "new" "shipped" "new" ...
    #>   .. ..$ cart            :List of 5
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 9079
    #>   .. .. .. ..$ date: Date[1:1], format: "2020-01-02"
    #>   .. .. .. ..$ fr  : num 8395
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 7031
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-20"
    #>   .. .. .. ..$ fr  : num 994
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 3792
    #>   .. .. .. ..$ date: Date[1:1], format: "2020-01-07"
    #>   .. .. .. ..$ fr  : num 2799
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 6807
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-10"
    #>   .. .. .. ..$ fr  : num 8252
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 3717
    #>   .. .. .. ..$ date: Date[1:1], format: "2020-01-11"
    #>   .. .. .. ..$ fr  : num 7503
    #>  $ :List of 1
    #>   ..$ data:'data.frame': 5 obs. of  4 variables:
    #>   .. ..$ id              : int [1:5] 17658 63868 43326 90201 55157
    #>   .. ..$ shipment_date   : Date[1:5], format: "2019-12-25" "2019-12-27" ...
    #>   .. ..$ siteorder_status:'data.frame':  5 obs. of  2 variables:
    #>   .. .. ..$ id  : int [1:5] 13 48 29 20 47
    #>   .. .. ..$ name: chr [1:5] "returned" "merged" "returned" "merged" ...
    #>   .. ..$ cart            :List of 5
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 7101
    #>   .. .. .. ..$ date: Date[1:1], format: "2020-01-20"
    #>   .. .. .. ..$ fr  : num 9917
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 1730
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-01"
    #>   .. .. .. ..$ fr  : num 4377
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 5641
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-11"
    #>   .. .. .. ..$ fr  : num 7010
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 7754
    #>   .. .. .. ..$ date: Date[1:1], format: "2019-12-23"
    #>   .. .. .. ..$ fr  : num 2551
    #>   .. .. ..$ :'data.frame':   1 obs. of  3 variables:
    #>   .. .. .. ..$ id  : int 5568
    #>   .. .. .. ..$ date: Date[1:1], format: "2020-01-02"
    #>   .. .. .. ..$ fr  : num 3127
    l
    #> [[1]]
    #> [[1]]$data
    #>      id shipment_date siteorder_status.id siteorder_status.name
    #> 1 53422    2019-12-13                  56               shipped
    #> 2 30856    2019-12-11                  68               shipped
    #> 3 67755    2020-01-03                  64                merged
    #> 4 58928    2020-01-13                  62                   new
    #> 5 76734    2020-01-06                  60                   new
    #>                              cart
    #> 1   8676.000, 18245.000, 8952.782
    #> 2                            NULL
    #> 3   6770.000, 18249.000, 9606.059
    #> 4 9602.0000, 18238.0000, 291.5286
    #> 5   6683.000, 18260.000, 5728.442
    #> 
    #> 
    #> [[2]]
    #> [[2]]$data
    #>      id shipment_date siteorder_status.id siteorder_status.name
    #> 1 54439    2019-12-29                  43                merged
    #> 2 69536    2019-12-06                  30                   new
    #> 3 22064    2020-01-14                  38               shipped
    #> 4 36821    2019-12-17                  53                   new
    #> 5 24478    2019-12-09                  76               shipped
    #>                              cart
    #> 1   9079.000, 18263.000, 8394.667
    #> 2 7031.0000, 18250.0000, 993.6618
    #> 3   3792.000, 18268.000, 2798.709
    #> 4   6807.000, 18240.000, 8252.129
    #> 5   3717.000, 18272.000, 7502.621
    #> 
    #> 
    #> [[3]]
    #> [[3]]$data
    #>      id shipment_date siteorder_status.id siteorder_status.name
    #> 1 17658    2019-12-25                  13              returned
    #> 2 63868    2019-12-27                  48                merged
    #> 3 43326    2019-12-12                  29              returned
    #> 4 90201    2020-01-10                  20                merged
    #> 5 55157    2020-01-05                  47                merged
    #>                            cart
    #> 1 7101.000, 18281.000, 9916.571
    #> 2 1730.000, 18231.000, 4376.873
    #> 3 5641.000, 18241.000, 7010.191
    #> 4 7754.000, 18253.000, 2551.029
    #> 5 5568.000, 18263.000, 3126.706

<sup>Created on 2020-01-20 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...