R - извлечь данные из json - PullRequest
0 голосов
/ 13 марта 2020

Мой фрейм данных выглядит следующим образом

exmpl <-
  data.frame(
    id = c(1),
    json = c("{ \"name\":\"John\", \"age\":30, \"car\":null }")
  ) %>% 
  mutate(json = as.character(json))

Он содержит json, отформатированный как символ, но мой реальный json намного длиннее, и некоторые jsons включают в себя элементы, которые другие нет. Мне нужно отфильтровать элементы, которые присутствуют в моем векторе.

eq <- c("name", "car")

И создать из него новый столбец, поэтому результат должен быть.

result <-
  data.frame(
    id = c(1),
    json = c("{ \"name\":\"John\", \"age\":30, \"car\":null }")
    json_filtered = c("{ \"name\":\"John\", \"car\":null }")
  ) %>% 
  mutate(json = as.character(json))

Я ищу решение dplyr, но если у вас есть идеи не-dplyr, не стесняйтесь:)

1 Ответ

1 голос
/ 13 марта 2020

Вот вариант, использующий jsonlite

library(tidyverse)
library(jsonlite)
exmpl %>%
    mutate(json_filtered = map_chr(list(fromJSON(json)), ~toJSON(.x[names(.x) %in% eq])))
#  id                                    json              json_filtered
#1  1 { "name":"John", "age":30, "car":null } {"name":["John"],"car":{}}

Возможно, будет проще хранить отфильтрованные записи в столбце list, в этом случае вы бы сделали

exmpl %>%
    mutate(json_filtered = map(list(fromJSON(json)), ~.x[names(.x) %in% eq]))

Столбец json_filtered затем содержит list, каждый элемент которого имеет имя list с записями, совпадающими с eq.

...