Хранение данных во фрейме данных из за цикла - rentrez
Я пытаюсь найти список SNP, которые имеют записи PubMed, используя rentrez
пакет. Когда я запускаю приведенный ниже код, я получаю нулевой фрейм данных. Я думаю, что я не пишу фрейм данных правильно.
library(rentrez)
term <- c('AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]',
'AKR1C2[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]')
p.snps <- for (i in seq_along(term)) {
entrez_search(db="SNP",
term = i,
usehistory = "y"
)
}
Я хотел бы сделать это для примерно 100 генов.
1 ответ
Проблемы
Есть несколько проблем:
for
циклы не возвращают значение- второй аргумент
entrez_search
должна быть символьная строка, представляющая термин, но код в вопросе передает ему число - вопрос относится к фрейму данных, но естественный способ вернуть это список
"esearch"
объекты (хотя это может быть позже преобразовано).
Исправленный код
Попробуй это:
p.snps <- vector(length = length(term), mode = "list")
for (i in seq_along(term)) {
p.snps[[i]] <- entrez_search(db = "SNP", term = term[i], history = "y")
}
names(p.snps) <- term
Более короткая альтернатива или все в одной строке:
p.snps <- sapply(term, entrez_search, db = "SNP", usehistory = "y", simplify = FALSE)
Длинный фрейм данных
Чтобы преобразовать этот список в длинную форму данных ids
со вторым столбцом, дающим запрос:
ids <- lapply(p.snps, "[[", "ids")
stack(ids)
давая:
values ind
1 41314625 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]
2 17344137 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]
3 11548049 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]
4 7097713 AKR1C1[GENE] AND snp_pubmed[Filter] AND Homo sapiens[Organism]
...etc...
Если вы предпочитаете индексные значения (1, 2, ...), а не строки запроса, запустите этот оператор до stack
заявление:
names(ids) <- seq_along(ids)
В этом случае вывод инструкции стека будет:
values ind
1 41314625 1
2 17344137 1
3 11548049 1
4 7097713 1
5 3930965 1
6 3763675 1
...etc...