tl;dr:由rentrez生成的摘要列表有什么不同,为什么这些列表在使用append()合并后停止与其他rentrez函数一起工作
我正在使用rentrez访问Pubmed。我可以毫无问题地搜索出版物和下载电子邮件。但是,关于摘要列表肯定有一些我不理解的特殊之处,因为当我使用append()尝试合并列表时,事情就会变得混乱。我还不能通过阅读文档来弄清楚这是什么区别。下面的代码让我可以毫无问题地搜索Pubmed并下载记录:
# set search term and retmax
term_set <- '"Transcription, Genetic"[Mesh] AND "Regulatory Sequences, Nucleic Acid"[Mesh] AND 2017:2018[PDAT]'
retmax_set <- 500
# search pubmed using web history
search.l <- entrez_search(db = "pubmed", term = term_set, use_history = T)
# get summaries of search hits using web history
for (seq_start in seq(0, search.l$count, retmax_set)) {
if (seq_start == 0) {summary.l <- list()}
summary.l[[length(summary.l)+1]] <- entrez_summary(
db = "pubmed",
web_history = search.l$web_history,
retmax = retmax_set,
retstart = seq_start
)
}但是,先使用summary.l <- list(),然后使用summary.l[[length(summary.l)+1]] <- entrez_summary(...,会得到一个客户列表列表(在此搜索中为3个子列表)。这会导致在数据提取的后续步骤中出现多个for循环(如下所示),这是一种粗糙的数据结构。
# extract desired information from esummary, convert to dataframe
for (i in 1:length(summary.l)) {
if (i == 1) {faut.laut.l <- list()}
faut.laut <- summary.l[[i]] %>%
extract_from_esummary(
c("uid", "sortfirstauthor", "lastauthor"),
simplify = F
)
faut.laut.l <- c(faut.laut.l, faut.laut)
}
faut.laut.df <- rbindlist(faut.laut.l)在下面的代码中使用append()给出了一个包含所有1334个补丁的列表,避免了子列表。
# get summaries of search hits using web history
for (seq_start in seq(0, search.l$count, retmax_set)) {
if (seq_start == 0) {
summary.append.l <- entrez_summary(
db = "pubmed",
web_history = search.l$web_history,
retmax = retmax_set,
retstart = seq_start
)
}
summary.append.l <- append(
summary.append.l,
entrez_summary(
db = "pubmed",
web_history = search.l$web_history,
retmax = retmax_set,
retstart = seq_start
)
)
}然而,在接下来的步骤中,extract_from_esummary()会抛出一个错误,即使文档说明参数esummaries应该是esummary对象的列表。
# extract desired information from esummary, convert to dataframe
faut.laut.append.l <- extract_from_esummary(
esummaries = summary.append.l,
elements = c("uid", "sortfirstauthor", "lastauthor"),
simplify = F
)
Error in UseMethod("extract_from_esummary", esummaries) :
no applicable method for 'extract_from_esummary' applied to an object of class "list"
faut.laut.append.df <- rbindlist(faut.laut.append.l)
Error in rbindlist(faut.laut.append.l) :
object 'faut.laut.append.l' not found少于500条记录的搜索可以在entrez_summary()的一次调用中完成,并且不需要连接列表。因此,下面的代码可以正常工作。
# set search term and retmax
term_set_small <- 'kadonaga[AUTH]'
retmax_set <- 500
# search pubmed using web history
search_small <- entrez_search(db = "pubmed", term = term_set_small, use_history = T)
# get summaries from search with <500 hits
summary_small <- entrez_summary(
db = "pubmed",
web_history = search_small$web_history,
retmax = retmax_set
)
# extract desired information from esummary, convert to dataframe
faut.laut_small <- extract_from_esummary(
esummaries = summary_small,
elements = c("uid", "sortfirstauthor", "lastauthor"),
simplify = F
)
faut.laut_small.df <- rbindlist(faut.laut_small)为什么append()会破坏月经,这是可以避免的吗?谢谢。
发布于 2018-08-07 06:40:28
在这一点上,extract_from_esummary的文档有点混乱。它真正需要的是一个esummary对象或一个esummary_list。因为esummary对象本身继承自一个列表,所以我认为我们不能轻易地让extract_from_esummary处理抛给它的任何列表。我会修复文档,也许会为对象考虑一个更好的设计。
要解决此特定问题,有几个修复方法。首先,您可以对esummaries列表进行重新分类
class(summary.append.l) <- c("list", "esummary_list")
extract_from_esummary(summary.append.l, "sortfirstauthor")应该能行得通。另一种选择是在进行任何追加之前提取相关数据。这与您的示例类似,具有更多的lapply和更少的for
all_the_summs <- lapply(seq(0,50,5), function(s) {
entrez_summary(db="pubmed",
web_history=search.l$web_history,
retmax=5, retstart=s)
})
desired_fields <- lapply(all_the_summs, extract_from_esummary, c("uid", "sortfirstauthor", "lastauthor"), simplify=FALSE)
res <- do.call(cbind.data.frame, desired_fields)希望这能提供一条前进的道路。
https://stackoverflow.com/questions/51715406
复制相似问题