Я столкнулся с проблемой, когда пакет получает таксономическую информацию (по видам), которая не имеет одинаковую длину.Следовательно, функция сохраняет выходные данные в списке, элементы которого содержат таблицы из 2 строк и различного числа столбцов (1 строка для таксономического ранга, 1 строка для самой информации):
taxo.spA <- data.frame(name=c("Animalia", "Arthropoda", "Chelicerata",
"Arachnida", "Acari"),
rank=c("Kingdom", "Phylum", "Subphylum", "Class",
"Subclass"))
taxo.spB <- data.frame(name=c("Animalia", "Chordata", "Vertebrata",
"Gnathostomata", "Actinopterygii", "Perciformes",
"Trachinoidei", "Ammodytidae", "Ammodytes",
"Ammodytes tobianus"),
rank=c("Kingdom", "Phylum", "Subphylum", "Superclass",
"Class", "Order", "Suborder", "Family", "Genus",
"Species"))
Я бы хотелв итоге получится таблица с рангами в виде столбцов и именами в виде строк.Основная проблема заключается в том, что таксономия обычно варьируется с точки зрения рангов, при этом некоторые таксоны не разрешаются вплоть до уровня вида (например, это Acari), или, если разрешены, ранги могут отличаться (отсутствие суперкласса), поэтому вы не можете связать илиrbind этих таблиц (= различное количество столбцов или строк).
Однако таксономические ранги следуют иерархии, поэтому я пытался реконструировать эту серию рангов (Королевство до Видов или подвидов).Интересно, как лучше к этому подойти?Существует ли пакет / функция, которая находит соответствие между двумя строками и местом, куда вставить то, что отсутствует?
Например:
ranks1 <- c("Kingdom", "Phylum", "Subphylum", "Class")
ranks2 <- c("Kingdom", "Phylum", "Subphylum", "Superclass", "Class", "Order")
Функция идентифицирует это Kingdom: Subphylumи класс являются общими.Но также, что Subphylum и Class окружают Superclass, так что Superclass может быть вставлен между Subphylum и Class.Наконец, этот Порядок отсутствует и должен быть сразу после класса, справа от него:
"Королевство", "Тип", "Субфилум", "Суперкласс", "Класс", "Порядок"
В конечном счете, функция, которую я пишу, построит файл data.frame с n столбцами (= самая длинная таксономия) и S строками (количество таксонов) и заполнит ее таксономической информацией, которая есть у меня по каждому таксону, в правильном столбце.оставляя остальные как NA.
desired.output <- data.frame(rbind(c("Animalia", "Arthropoda", "Chelicerata",
NA, "Arachnida", "Acari", NA),
c("Animalia", "Chordata", "Vertebrata",
"Gnathostomata", "Actinopterygii", NA,
"Perciformes")))
names(desired.output) <- c("Kingdom", "Phylum", "Subphylum", "Superclass",
"Class", "Subclass", "Order")
Я попытался начать с одной из наиболее полной информации, которую я имею, и заполнить пробелы по сравнению с другими таксонами.Я играл с setdiff (), intersect (),% в%;и попытался выяснить, что общего, что принадлежит только одной из двух строк, и перестроить это, но я не уверен, что это лучший путь?
Есть идеи?Предложения?
NB. Я буду хранить набор данных в качестве блока данных (хотя пока больше в виде матрицы), так как позже объединю его с другими наборами данных.
РЕДАКТИРОВАТЬ /ОТВЕТЬ НИЖЕ
Итак, прежде всего, спасибо за помощь.Я вдохновился ответами и сумел заставить это работать.
Основная проблема заключалась в том, что таблицы, содержащиеся в списке (1), не имели одинакового количества строк, (2) строки могли содержать разныеinfo (некоторые ранги могут быть пропущены в таксономии), что затрудняет объединение всего в одну таблицу.
Однако таксономия имеет эту древовидную иерархию, которую я мог бы использовать, чтобы найти, как эти ранги разветвляются.Как я решил эту проблему:
Я использовал организм, который имел наиболее разрешенную информацию в качестве моей справочной информации (= наибольшее количество рангов), затем взял каждый список рангов (вектор рангов) и нашел различияс этим самым решенным вектором.Затем я ищу положение этих недостающих рангов, просматривая, какие ранги будут находиться выше и ниже их в иерархии и где они будут совпадать в моей ссылке.
Возможны четыре случая (NB, наивысший ранг включенслева, самый нижний справа):
- нет совпадений : я не могу поставить этот ранг в таксономии (пока)
- 2совпадения : я могу разместить недостающую информацию между двумя совпадениями в моем справочнике
- 1 совпадение слева : я могу разместить его после матча
- 1 совпадение справа : я могу разместить его перед матчем
Я перебрал недостающие ранги и последовательно увеличивал ранги, пока все возможные ранги в наборе данных не были включены в вектор: Я использовал функцию append () для последовательного добавления отсутствующего ранга после определенной позиции, определяемой позициями общих рангов между эталонной и другими таксономиями.
Наконец, я использовал этот вектор в качестве имен столбцов для финальной таблицы и заполнил таблицу информацией о таксонах (см. Ниже).Возможно, не самый лучший, но должен быть единообразным во всех таксономиях.
Большое спасибо!(PS Приятно, когда он, наконец, делает то, что должен)
