#r #dplyr
Вопрос:
Я использую R tidyverse для очистки данных, загруженных из pubmed, чтобы получить сведения об авторах некоторых статей. Я зашел так далеко, и у меня есть данные, которые выглядят так:
pubmed_id variable_id entry 29542687 PMID 29542687 29542687 FAU Kato 29542687 FAU Gregory J 29542687 AU Kato GJ 29542687 AD Heart 29542687 AD Lung and Blood Vascular Medicine Institute and the Division of 29542687 AD Hematology-Oncology 29542687 AD Department of Medicine 29542687 AD University of Pittsburgh 29542687 AD 200 Lothrop 29542687 AD Street 29542687 AD Pittsburgh 29542687 AD PA 15261 29542687 AD USA. 29542687 FAU Piel 29542687 FAU Fredrich 29542687 AU Piel FB 29542687 AD PHE Centre for Environment and Health 29542687 AD Department of Epidemiology and 29542687 AD Biostatistics 29542687 AD School of Public Health 29542687 AD Faculty of Medicine 29542687 AD Imperial College 29542687 AD London 29542687 AD London 29542687 AD UK. 29542687 FAU Reid 29542687 FAU Clarice D 29542687 AU Reid CD 29542687 AD Sickle Cell Disease Branch 29542687 AD National Heart 29542687 AD Lung and Blood Institute 29542687 AD NIH 29542687 AD Bethesda 29542687 AD 29542687 AD MD 29542687 AD USA. 29542687 FAU Gaston 29542687 FAU Marilyn H 29542687 AU Gaston MH 29542687 AD The Gaston and Porter Health Improvement Center 29542687 AD Potomac 29542687 AD MD 29542687 AD USA.
Я хочу преобразовать это в данные, которые выглядят следующим образом:
pubmed_id full_author author address 29542687 Kato, Gregory J Kato GJ Heart Lung and Blood Vascular Medicine Institute and the Division of Hematology-Oncology Department of Medicine University of Pittsburgh 200 Lothrop Street Pittsburgh PA 15261 USA. 29542687 Piel, Fredrich B Piel FB PHE Centre for Environment and Health Department of Epidemiology and Biostatistics School of Public Health Faculty of Medicine Imperial College London London UK. 29542687 Reid, Clarice D Reid CD National Heart Lung and Blood Institute NIH Bethesda MD USA. 29542687 Gaston, Marilyn H Gaston MH The Gaston and Porter Health Improvement Center Potomac MD USA.
Первоначальная мысль состояла в том, чтобы каким-то образом ранжировать каждого автора, прежде чем объединять последовательные строки, но изо всех сил старался создать рейтинг, который мог бы обрабатывать переменное количество объявлений (адресных строк). Строка FAU-это полное имя автора, но оно указано в двух строках. Поле pubmed_id используется для отслеживания всех авторов, перечисленных в одной статье. Примеры данных:
structure(list(pubmed_id = c(29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L, 29542687L), variable_id = c("PMID", "FAU", "FAU", "AU", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "FAU", "FAU", "AU", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "FAU", "FAU", "AU", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "AD", "FAU", "FAU", "AU", "AD", "AD", "AD", "AD"), entry = c("29542687", "Kato", "Gregory J", "Kato GJ", "Heart", "Lung and Blood Vascular Medicine Institute and the Division of", "Hematology-Oncology", "Department of Medicine", "University of Pittsburgh", "200 Lothrop", "Street", "Pittsburgh", "PA 15261", "USA.", "Piel", "Fredrich", "Piel FB", "PHE Centre for Environment and Health", "Department of Epidemiology and", "Biostatistics", "School of Public Health", "Faculty of Medicine", "Imperial College", "London", "London", "UK.", "Reid", "Clarice D", "Reid CD", "Sickle Cell Disease Branch", "National Heart", "Lung and Blood Institute", "NIH", "Bethesda", "", "MD", "USA.", "Gaston", "Marilyn H", "Gaston MH", "The Gaston and Porter Health Improvement Center", "Potomac", "MD", "USA.")), class = "data.frame", row.names = c(NA, -44L))
Очень признателен за любые указания по очистке этих данных. Спасибо!
Ответ №1:
Один из вариантов достижения желаемого результата может выглядеть так:
- Поскольку ваши данные содержат несколько авторов
pubmed_id
, я сначала добавляю идентификатор для авторов - После этого мы могли бы использовать group_by summarize, чтобы свернуть записи для полного имени автора и адреса в отдельные строки, где я использую a
;
в качестве разделителя - Теперь мы готовы к преобразованию в широкий формат
- Наконец, замените
;
в столбце «Полный автор,
» на «а», удалите его из столбца «адрес» и переименуйте столбцы
library(dplyr) library(tidyr) d %gt;% filter(!variable_id %in% "PMID") %gt;% group_by(pubmed_id) %gt;% mutate(author_id = cumsum(variable_id == "FAU" amp; !lag(variable_id) %in% "FAU")) %gt;% group_by(variable_id, author_id, .add = TRUE) %gt;% summarise(entry = paste(entry, collapse = "; "), .groups = "drop") %gt;% pivot_wider(names_from = variable_id, values_from = entry) %gt;% mutate(FAU = gsub("; ", ", ", FAU), AD = gsub("; ", " ", AD)) %gt;% select(pubmed_id, author_id, full_author = FAU, author = AU, adress = AD) #gt; # A tibble: 4 × 5 #gt; pubmed_id author_id full_author author adress #gt; lt;intgt; lt;intgt; lt;chrgt; lt;chrgt; lt;chrgt; #gt; 1 29542687 1 Kato, Gregory J Kato GJ Heart Lung and Blood Vascular… #gt; 2 29542687 2 Piel, Fredrich Piel FB PHE Centre for Environment an… #gt; 3 29542687 3 Reid, Clarice D Reid CD Sickle Cell Disease Branch Na… #gt; 4 29542687 4 Gaston, Marilyn H Gaston MH The Gaston and Porter Health …
Комментарии:
1. Очень умное использование cumsum и lag для создания идентификаторов авторов; Я экспериментировал с данными.таблица::rleid, но это приятно. Спасибо!
Ответ №2:
Этот уродливый… но возможное решение или, по крайней мере, шаг в направлении решения вашей проблемы с данными:
library(tidyverse) library(data.table) left_join( df %gt;% mutate(temp = data.table::rleid(variable_id == "FAU")) %gt;% group_by(temp) %gt;% mutate(full_author = case_when(variable_id == "FAU" ~ paste0(lag(entry), ", ", entry)), author = case_when(variable_id == "FAU" ~ paste0(lag(entry), " ", sapply(str_extract_all(entry, '[A-Z] '),paste0, collapse = '')))) %gt;% slice(2), df %gt;% mutate(temp = data.table::rleid(variable_id == "FAU")) %gt;% group_by(temp) %gt;% filter(variable_id == "AD") %gt;% summarise(address = paste(entry, collapse = " ")), by = "temp" ) %gt;% ungroup() %gt;% fill(address, .direction = "up") %gt;% select(pubmed_id, full_author, author, address) %gt;% drop_na
Это дает нам:
# A tibble: 4 x 4 pubmed_id full_author author address lt;intgt; lt;chrgt; lt;chrgt; lt;chrgt; 1 29542687 Kato, Gregory J Kato GJ Heart Lung and Blood Vascular Medicine Institute and the Division of Hematology-Oncology Department of Medicine University of Pittsb~ 2 29542687 Piel, Fredrich Piel F PHE Centre for Environment and Health Department of Epidemiology and Biostatistics School of Public Health Faculty of Medicine Imper~ 3 29542687 Reid, Clarice D Reid CD Sickle Cell Disease Branch National Heart Lung and Blood Institute NIH Bethesda MD USA. 4 29542687 Gaston, Marilyn~ Gaston MH The Gaston and Porter Health Improvement Center Potomac MD USA.
Ответ №3:
Вот еще одна альтернатива!
library(tidyverse) df %gt;% mutate(variable_id1 = lead(variable_id)) %gt;% group_by(id_Group = cumsum(variable_id=="FAU" amp; variable_id1=="FAU")) %gt;% filter(id_Group!=0) %gt;% mutate(entry = ifelse(variable_id=="FAU", paste(first(entry), first(entry,2), sep=", "),entry)) %gt;% slice(-1) %gt;% group_by(id_Group, variable_id) %gt;% mutate(entry = ifelse(variable_id=="AD", paste(entry, collapse = " "), entry)) %gt;% group_by(id_Group) %gt;% slice(1:3) %gt;% select(-variable_id1, -id_Group) %gt;% mutate(variable_id = case_when(variable_id == "FAU"~ "full_author", variable_id == "AU" ~ "author", TRUE ~ "address")) %gt;% pivot_wider( names_from = variable_id, values_from = entry ) %gt;% select(-id_Group)
id_Group pubmed_id full_author author address lt;intgt; lt;intgt; lt;chrgt; lt;chrgt; lt;chrgt; 1 1 29542687 Kato, Gregory J Kato GJ Heart Lung and Blood Vascular Medicine Institute and~ 2 2 29542687 Piel, Fredrich Piel FB PHE Centre for Environment and Health Department of ~ 3 3 29542687 Reid, Clarice D Reid CD Sickle Cell Disease Branch National Heart Lung and B~ 4 4 29542687 Gaston, Marilyn H Gaston MH The Gaston and Porter Health Improvement Center Poto~