У меня есть фрейм данных (более 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) ------^
Использование 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
@Bloxx Перебирайте строки, используя lapply
, смотрите обновление.
Спасибо за ваш ответ. Он работает с однострочными данными, но я получаю сообщение об ошибке: "Ошибка: ошибка синтаксического анализа: конечный мусор, "pub_date": "2002-05-08"}] [{"patent_number": "JP3498514B2 (прямо здесь) -- ----^" при выполнении в нескольких строках