Как добавить элементы списка в новый столбец данных внутри другого списка в r? - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь извлечь имена и принадлежности соавторов для всех публикаций на опубликованных.Мне удалось получить список имени автора в кадре данных, но теперь мне нужно добавить связь с именем.Я пытался сделать это, но я не уверен, как.

Мне нужно объединить два списка: авторов и принадлежности для каждого автора в один.

query = "an author's name"

res <- EUtilsSummary(query, db="pubmed", mindate=2015, maxdate=2019)
QueryCount(res)

auths <- Author(EUtilsGet(res))
affs <- Affiliation(EUtilsGet(res))

Last<-sapply(auths, function(x)paste(x$LastName, x$ForeName, sep = ", "))
auths2<-as.data.frame(sort(table(unlist(Last)), dec=TRUE))
names(auths2)<-c("name")
auths2

Я использую RISmed для извлечения данных.Я хочу получить данные в следующем формате:

Фамилия, Имя Присоединение

Меня не волнует количество.

Полагаю, можно взглянуть на это иначе:

Объедините два списка вместе.

список A - это список данных. В этом списке есть несколько элементов, каждый из которых имеет следующий

LastName   ForeName   Initials
A          B          AB
C          D          CD

список B - это список списков:

Affiliations:
"X university"
"Y University"

Что я хочу сделать, так это объединить эти два списка так, чтобы присоединения отображались для каждого автора в виде столбца на фрейме данных.Окончательный результат будет следующим:

LastName   ForeName   Initials   Affiliations
A          B          AB         "X University"
C          D          CD         "Y University"

1 Ответ

0 голосов
/ 28 января 2019

Так как некоторые запросы могут возвращать NA значения для авторов и векторы нулевой длины для присоединений, я сделал небольшую функцию, которая только cbind() значений, если записи обоих списков верны:

special_cbind = function(authors,affiliations){
  if(length(affiliations) == 0 | all(is.na(authors)) ){
    authors
  }
  else if(nrow(authors) == length(affiliations)){
    cbind(authors,affiliations)
  }
  else{
    affiliations = rep(affiliations,nrow(authors))
    cbind(authors,affiliations)
  }

}

Затем примените его к каждой записи списка с помощью Map.

Map(special_cbind,auths,affs)

Это работает для ваших данных?

...