Как добавить элементы списка в новый столбец фрейма данных внутри другого списка в r?

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

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

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"

person user6401955    schedule 28.01.2019    source источник


Ответы (1)


Поскольку некоторые запросы могут возвращать 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)

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

person Fino    schedule 28.01.2019
comment
Абсолютно. Пришлось внести небольшие доработки, но они потрясающие!!! Огромное спасибо - person user6401955; 28.01.2019