В каждом кадре данных у меня есть запись строки, которая выглядит так:
[{'degree': 0.1, 'name': 'Colins Dental Clinic', 'rating': 9, 'level': 'fourth'}]
Это прямой импорт из read.csv
файла.
Я хотел бы создать два столбца из каждой записи, которые извлекают два числовых значения сверху: 0,1 и 9, которые представляют собой информацию о степени и рейтинге стоматологической клиники.
Я пробовал подстроку и использование sep = ","
с кавычками, но у меня что-то не получается.
Как мне это сделать правильно?
Похоже, данные JSON отформатированы неправильно (из-за одинарных кавычек).
Вы не предоставили образец своего фрейма данных, но вы можете попробовать что-то вроде этого (2 варианта):
### Packages
library(dplyr)
library(stringr)
library(jsonlite)
### Data
df=data.frame(col1 = "dummy",
col2 = "dummy",
col3 = "[{'degree': 0.1, 'name': 'Colins Dental Clinic', 'rating': 9, 'level': 'fourth'}]")
### Option 1 : Transform your column data into a valid JSON then extract data from it
df1=df %>% mutate(col3=str_replace_all(col3,"'","\\\""),
col3=str_replace_all(col3,"(?<=: )None(?=[,}])","\\\"None\\\""),
degree=fromJSON(col3)$degree,
rating=fromJSON(col3)$rating)
### Option 2 : Use regex to get directly what you need (less secure)
df2=df %>% mutate(degree=str_extract(col3,"(?<=degree': )\\d\\.\\d"),
rating=str_extract(col3,"(?<=rating': )\\d"))
Выход :
Ответ был обновлен с исправлением для управления случаями «Нет». В противном случае вы можете использовать «Вариант 2».
Эй, спасибо за обновление. В вашем методе варианта 2 я получаю сообщение об ошибке: Ошибка в UseMethod("mutate"): нет применимого метода для "mutate", примененного к объекту класса "character"
Вариант 2 для меня актуален. Проверьте имя вашего фрейма данных («df» или другое имя), имя столбца, содержащего данные JSON («col3» или другое имя), и наличие оператора канала :%>%
.
Это работает! Вы были правы, мое имя было неправильным! Большое спасибо!
Я получаю следующее сообщение об ошибке: лексическая ошибка: недопустимый символ в тексте JSON. У меня есть поле, в котором есть что-то вроде: «Парковка»: нет. Ни один из них не является местом возникновения ошибки. Знаешь, как я могу это исправить?