如何将列表项添加到R中另一个列表内的新数据框列中?

时间:2019-01-28 15:45:46

标签: r dplyr text-mining 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"

1 个答案:

答案 0 :(得分: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(special_cbind,auths,affs)

这对您的数据有用吗?