Как разделить строки в r data.frame, содержащие данные JSON?

#r #json

#r #json

Вопрос:

У меня есть фрейм данных (более 1500 очищенных патентных данных), содержащий данные json:

 df <- data.frame(patent = "EP1036268B1",
             citation = '[{"patent_number": "DE2836002C2", "priority_date": "1978-08-17", "pub_date": "1986-09-11"}, {"patent_number": "SE457831B", "priority_date": "1987-08-27", "pub_date": "1989-01-30"}, {"patent_number": "DE3916547A1", "priority_date": "1989-05-20", "pub_date": "1990-11-22"}, {"patent_number": "US5180983A", "priority_date": "1990-09-27", "pub_date": "1993-01-19"}, {"patent_number": "DE69428626T2", "priority_date": "1993-05-31", "pub_date": "2002-05-08"}]')
 

Я хочу разделить строки и получить следующий результат:

 df_res <- data.frame(patent = c("EP1036268B1", "EP1036268B1","EP1036268B1", "EP1036268B1","EP1036268B1"),
                 patent_number = c("DE2836002C2", "SE457831B", "DE3916547A1", "US5180983A","DE69428626T2"),
                 priority_date = c("1978-08-17","1987-08-27", "1989-05-20", "1990-09-27","1993-05-31"),
                 pub_date = c("1986-09-11", "1989-01-30", "1990-11-22", "1993-01-19","2002-05-08"))
 

Я нашел много решений, в которых на ячейку приходится один «объект json», но у меня их несколько, и их количество варьируется в зависимости от строк.

Заранее благодарим вас за помощь!

ОБНОВЛЕНИЕ (с несколькими строками)

 df <- data.frame(patent = c("EP1036268B1", "CN101386287B"),
             citation = c('[{"patent_number": "DE2836002C2", "priority_date": "1978-08-17", "pub_date": "1986-09-11"}, {"patent_number": "SE457831B", "priority_date": "1987-08-27", "pub_date": "1989-01-30"}, {"patent_number": "DE3916547A1", "priority_date": "1989-05-20", "pub_date": "1990-11-22"}, {"patent_number": "US5180983A", "priority_date": "1990-09-27", "pub_date": "1993-01-19"}, {"patent_number": "DE69428626T2", "priority_date": "1993-05-31", "pub_date": "2002-05-08"}]','[{"patent_number": "JP3498514B2", "priority_date": "1997-02-06", "pub_date": "2004-02-16"}, {"patent_number": "JP3870503B2", "priority_date": "1997-09-01", "pub_date": "2007-01-17"}]'))
 

Желаемый результат:

 df_res <- data.frame(patent = c("EP1036268B1", "EP1036268B1","EP1036268B1", "EP1036268B1","EP1036268B1","CN101386287B","CN101386287B"),
                 patent_number = c("DE2836002C2", "SE457831B", "DE3916547A1", "US5180983A","DE69428626T2", "JP3498514B2","JP3870503B2"),
                 priority_date = c("1978-08-17","1987-08-27", "1989-05-20", "1990-09-27","1993-05-31","1997-02-06","1997-09-01"),
                 pub_date = c("1986-09-11", "1989-01-30", "1990-11-22", "1993-01-19","2002-05-08","2004-02-16", "2007-01-17"))
 

При запуске cbind(patent=df$patent, fromJSON(df$citation)) я получаю следующую ошибку:

 Error: parse error: trailing garbage
      , "pub_date": "2002-05-08"}] [{"patent_number": "JP3498514B2
                 (right here) ------^
 

Ответ №1:

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

 library(jsonlite)
cbind(patent=df$patent, fromJSON(df$citation))
#        patent patent_number priority_date   pub_date
# 1 EP1036268B1   DE2836002C2    1978-08-17 1986-09-11
# 2 EP1036268B1     SE457831B    1987-08-27 1989-01-30
# 3 EP1036268B1   DE3916547A1    1989-05-20 1990-11-22
# 4 EP1036268B1    US5180983A    1990-09-27 1993-01-19
# 5 EP1036268B1  DE69428626T2    1993-05-31 2002-05-08
 

Для использования нескольких строк lapply .

 lapply(1:nrow(df), function(x) cbind(patent=df[x, "patent"], fromJSON(df[x, "citation"])))
# [[1]]
#        patent patent_number priority_date   pub_date
# 1 EP1036268B1   DE2836002C2    1978-08-17 1986-09-11
# 2 EP1036268B1     SE457831B    1987-08-27 1989-01-30
# 3 EP1036268B1   DE3916547A1    1989-05-20 1990-11-22
# 4 EP1036268B1    US5180983A    1990-09-27 1993-01-19
# 5 EP1036268B1  DE69428626T2    1993-05-31 2002-05-08
# 
# [[2]]
#         patent patent_number priority_date   pub_date
# 1 CN101386287B   JP3498514B2    1997-02-06 2004-02-16
# 2 CN101386287B   JP3870503B2    1997-09-01 2007-01-17
 

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

1. Спасибо за ваш ответ. Он работает с однострочными данными, но я получаю сообщение об ошибке: «Ошибка: ошибка синтаксического анализа: завершающий мусор», pub_date»: «2002-05-08″}] [{» patent_number»: «JP3498514B2 (прямо здесь) —— ^» при выполнении в нескольких строках

2. @Bloxx перебирает строки, используя lapply , см. Обновление.