Использование fromJSON для преобразования в один фрейм данных, когда один столбец является списком фреймов данных? - PullRequest
1 голос
/ 29 апреля 2019

У меня проблема с преобразованием JSON в пригодный для использования фрейм данных. Проблема возникает, когда исходный JSON имеет несколько уровней, и результат использования fromJSON заканчивается тем, что он становится столбцом фреймов данных в пределах большего фрейма данных. Этот столбец фреймов данных также содержит списки и фреймы данных внутри себя. Я хотел бы сгладить весь файл, чтобы извлечь один кадр данных и выбрать необходимые столбцы оттуда.

Я могу использовать API Shopify в качестве примера:

"line_items": [
  {
    "fulfillable_quantity": 1,
    "fulfillment_service": "amazon",
    "fulfillment_status": "fulfilled",
    "grams": 500,
    "id": 669751112,
    "price": "199.99",
    "product_id": 7513594,
    "quantity": 1,
    "requires_shipping": true,
    "sku": "IPOD-342-N",
    "title": "IPod Nano",
    "variant_id": 4264112,
    "variant_title": "Pink",
    "vendor": "Apple",
    "name": "IPod Nano - Pink",
    "gift_card": false,
    "price_set": {
      "shop_money": {
        "amount": "199.99",
        "currency_code": "USD"
      },
      "presentment_money": {
        "amount": "173.30",
        "currency_code": "EUR"
      }
    },
    "properties": [
      {
        "name": "custom engraving",
        "value": "Happy Birthday Mom!"
      }
    ],
    "taxable": true,
    "tax_lines": [
      {
        "title": "HST",
        "price": "25.81",
        "price_set": {
          "shop_money": {
            "amount": "25.81",
            "currency_code": "USD"
          },
          "presentment_money": {
            "amount": "20.15",
            "currency_code": "EUR"
          }
        },
        "rate": 0.13
      }
    ],
    "total_discount": "5.00",
    "total_discount_set": {
      "shop_money": {
        "amount": "5.00",
        "currency_code": "USD"
      },
      "presentment_money": {
        "amount": "4.30",
        "currency_code": "EUR"
      }
    },
    "discount_allocations": [
      {
        "amount": "5.00",
        "discount_application_index": 2,
        "amount_set": {
          "shop_money": {
            "amount": "5.00",
            "currency_code": "USD"
          },
          "presentment_money": {
            "amount": "3.96",
            "currency_code": "EUR"
          }
        }
      }
    ]
  }
]

Если я использую следующий код для извлечения позиций:

Orders <- fromJSON(paste0("https:key:password//@random-shop.myshopify.com/admin/orders.json?status=any&created_at_max=",Sys.Date()-2,"T23:59:59-05:00&limit=250&created_at_min=",Sys.Date()-2,"T00:00:00-05:00&fields=created_at,id,name,total-price,number,line_items"),flatten = T)
Orders <- Orders$orders%>%
  flatten()
str(Orders)

Позиции будут отображаться в виде списка фреймов данных различной длины. В этих фреймах данных поля могут варьироваться от отдельных списков до фреймов данных.

К сожалению, это сложная проблема для полной репликации.

Есть ли способ взять список фреймов данных и сделать каждую переменную отдельным столбцом?

1 Ответ

0 голосов
/ 30 апреля 2019

используя JSON, который вы указали выше, например, файл с именем test.JSON

Импорт, чтобы получить список:

library(jsonlite)
orders <- fromJSON("~/Desktop/test.JSON", simplifyVector = F)

# Convert to a dataframe using purrr
library(purrr)
orders2 <- orders %>% 
    map(unlist) %>% 
    map_df(bind_rows)

Результат:

# A tibble: 1 x 41
  fulfillable_qua… fulfillment_ser… fulfillment_sta… grams id    price product_id quantity
  <chr>            <chr>            <chr>            <chr> <chr> <chr> <chr>      <chr>   
1 1                amazon           fulfilled        500   6697… 199.… 7513594    1  

Надеемсяэто то, что вам нужно - фрейм данных, где каждый столбец является записью из списка.

...