У меня есть два кадра данных, SCR и SpecpecSpecies. Названия предметов в SCR частично содержат виды, перечисленные в Специфических видах.Эффективный способ перебора двух списков (альтернатива вложенного цикла)
SpecificSpecies$Species
S cerevisiae
Daucus carota
SCR$MESH_HEADINGS
tetracycline CMT-3
zrg17 protein, S cerevisiae
EP4 glycoprotein, Daucus carota
Я пытаюсь получить подмножество SCR, содержащее только те записи, которые не имеют соответствующих видов. В приведенном выше случае, этот список будет только
tetracycline CMT-3.
Как я научился делать это будет с помощью вложенных циклов, сравнивая каждую запись в SCR для каждой записи в SpecificSpecies. Когда совпадение не найдено, добавьте строку SCR в новую таблицу:
For each row in SCR {
SpeciesNumber <- 1
match <-NULL
while ((is.null(match)) & (SpeciesNumber < length(SpecificSpecies$Species))) {
if (grepl(SpecificSpecies$Species[SpeciesNumber], SCR[row,]$MESH_HEADING)){
match <- TRUE}
SpeciesNumber <- SpeciesNumber + 1}
if ((is.null(match) & SpeciesNumber == length(SpecificSpecies$Species)) {
speciesNoMatch = rbind(speciesNoMatch, SCR[row])}
}}
Но это мучительно медленно с 65000 записей в SCR и около 1500 в SpecificSpecies. Есть ли способ гнездиться, как это, с лапкой? Или какая-то другая функция, которая поможет здесь, с которой я не знаком?
Я уверен, что это ужасный код для начала. Я медицинский библиотекарь, который иногда использует R для анализа данных, поэтому у меня очень ограниченные навыки программирования, но обычно это не имеет значения, являются ли мои решения уродливыми или неэффективными, пока они в конечном итоге работают. Я знаю, что должен быть лучший способ сделать это; простите меня за то, что я не знаю чего-то, что, вероятно, простое решение.
Нет, боюсь, что нет. Эти запятые не являются разделителями, они являются частью исходной строки. То есть, некоторые из записей принимают форму «имя Protien, название вида». Мне нужно использовать grep или regex или что-то вроде этого, чтобы обеспечить совпадения, так как вид будет соответствовать только части SCR $ MESH_HEADING. – NotMyJob
@NotMyJob Я только что заметил, посмотрю мое редактирование – Phil
Спасибо за помощь! Две вещи. Во-первых, ваш пример работает для меня, но не удается, когда я пытаюсь использовать свои фактические данные. Я получаю список 0s, а затем пустую таблицу в списке. Любая идея почему? Во-вторых, мне нужна вся запись из SCR, когда я подмножаюсь, а не только MESH_HEADING. Есть ли простой способ сделать это возвратом всей строки? – NotMyJob