Как извлечь столбцы из столбца json в кадре данных - PullRequest
0 голосов
/ 29 марта 2020

У меня есть данные, извлеченные из базы данных PostgreSQL со столбцом jsonb, это выглядит как

df <- data.frame(item_id = c(1,2),
                 item_price = c(2,3),
                 jsonb=c('{"name": "1st item", "color": "red", "taste": "vanilla"}',
                         '{"name": "2nd item", "color": "blue", "foo": "bar"}'))

Я хочу извлечь name и color, чтобы иметь

  item_id item_price     name color
1       1          2 1st item   red
2       2          3 2nd item  blue

Я знаю, как получить его напрямую из базы данных, но не из фрейма данных R.

PS Ронак Шах дал рабочее решение. Есть ли какое-нибудь решение с какой-нибудь библиотекой json?

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Использование jsonlite:

# Install pacakges if they are not already installed:

necessary_packages <- c("jsonlite")

# Create a vector containing the names of any packages needing installation:

new_packages <- necessary_packages[!(necessary_packages %in%
                                       installed.packages()[, "Package"])]

# If the vector has more than 0 values, install the new pacakges
# (and their) associated dependencies:

if (length(new_packages) > 0) {install.packages(new_packages, dependencies = TRUE)}

# Initialise the packages in the session:

lapply(necessary_packages, require, character.only = TRUE)

# Unnest the json and store it column bind it with the original dataframe: 

cbind(df[,names(df) != "jsonb"], 
      do.call("rbind", lapply(paste0("[", df$jsonb ,"]"), 
        function(x){fromJSON(x, flatten = TRUE)[,c("name", "color")]})))
1 голос
/ 29 марта 2020

Может быть, вы можете использовать регулярные выражения для извлечения необходимых данных:

library(dplyr)
library(stringr)

df %>%
  mutate(name = str_match(jsonb, '"name":(.*?),')[, 2], 
         color = str_match(jsonb, '"color":(.*?),')[, 2]) %>%
  select(-jsonb)

#  item_id item_price        name   color
#1       1          2  "1st item"   "red"
#2       2          3  "2nd item"  "blue"
...