r - 使用 append() 合并后,rentrez 的摘要列表停止工作
问题描述
tl; dr:由 生成的摘要列表有什么不同rentrez
,为什么所述列表在rentrez
使用 合并后停止与其他函数一起使用append()
?
我正在使用rentrez
. 我可以毫无问题地搜索出版物和下载摘要。但是,摘要列表一定有一些我不理解的特殊之处,因为当我过去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()
and thensummary.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()
破坏摘要,这可以避免吗?谢谢。
解决方案
的文档extract_from_esummary
对此有点混乱。它真正需要的是一个esummary
对象或一个esummary_list
. 因为esummary
对象本身继承自一个列表,我认为我们不能轻易地extract_from_esummary
处理任何抛出它的列表。我会修复文档,也许会考虑为对象提供更好的设计。
为了解决这个特殊问题,有一些修复。一,您可以重新分类摘要列表
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)
希望提供前进的道路。
推荐阅读
- gcc - 为什么 ldconfig 不链接或缓存我的库?
- c# - 是否可以验证数字签名并创建新文档,以便 Adobe 阅读器或福昕阅读器在启动时不应该验证相同
- android - 有什么方法可以从 ref 获取数据作为 java 中的列表
- mysql - 如何使用 JPA 更新 LocalDateTime 字段?
- sprite - 在移相器中使用几乎相同的精灵的好习惯。使用更多精灵的替代方法
- arrays - React 将数据推送到数组对象中
- rubymotion - NDK 错误:Android 安装
- php - 如何将 HAM Maidenhead Grid Squares 转换为经纬度?
- cytoscape.js - 我正在使用 cytoscape 设置“text-opacity:0”的样式,但它不起作用
- android - 编译 Flutter 时出现“任务 ':app:packageDebug' 执行失败 > 无法生成 v1 签名”异常