R проанализируйте столбец фрейма данных, имеющий массив JSON, и преобразуйте его в однократную кодировку

#r #json

#r #json

Вопрос:

У меня есть фрейм данных со столбцом, имеющим массив JSON в строковой форме. Моя цель — проанализировать столбец и преобразовать в однократную кодировку, но я столкнулся с ошибкой при разборе JSON.

 library(jsonlite)
> df <- data_frame(Amenities=c("["Parking", "Lawn", "Garage", "Frontyard"]", "["Parking", "Lawn", "Garage", "Backyard"]", "["Parking", "Lawn", "Garage"]"))
> df
# A tibble: 3 x 1
  Amenities                                           
  <chr>                                               
1 "["Parking", "Lawn", "Garage", "Frontyard"]"
2 "["Parking", "Lawn", "Garage", "Backyard"]" 
3 "["Parking", "Lawn", "Garage"]"               
> df <- df %>% mutate(Amenities=fromJSON(Amenities))
Error: parse error: trailing garbage
          awn", "Garage", "Frontyard"] ["Parking", "Lawn", "Garage", "
                     (right here) ------^
> 
 

Ожидаемый результат:

 Parking  Lawn  Garage  Frontyard  Backyard
      1     1       1          1         0
      1     1       1          0         1
      1     1       1          0         0
 

Решение:
Сохранение существующего фрейма данных, а также.

 library(qdapTools)
df <- cbind(df,  (mtabulate(str_extract_all(df$amenities, "\w (  \w )*"))))
 

Ответ №1:

Мы можем сделать это в одной строке с помощью mtabulate

 library(qdapTools)
library(stringr)
mtabulate(str_extract_all(df$Amenities, "\w "))
 

-вывод

 #  Backyard Frontyard Garage Lawn Parking
#1        0         1      1    1       1
#2        1         0      1    1       1
#3        0         0      1    1       1
 

Ответ №2:

Вы можете обрабатывать json как строки, очищать их и расширять набор данных.

 library(dplyr)

df %>%
  mutate(Amenities = gsub('\[|\]|"', '', Amenities)) %>%
  splitstackshape::cSplit_e("Amenities", sep = ',\s*', 
                            type = 'character', fill = 0, fixed = FALSE) %>%
  rename_with(~sub('Amenities_', '', .))

#                         Amenities Backyard Frontyard Garage Lawn Parking
#1 Parking, Lawn, Garage, Frontyard        0         1      1    1       1
#2  Parking, Lawn, Garage, Backyard        1         0      1    1       1
#3            Parking, Lawn, Garage        0         0      1    1       1
 

Комментарии:

1. Решение слишком сложное для меня. Есть ли другое более простое решение?

2. Вы можете проверить другое решение, если это кажется проще.