Дан вектор символьных строк, где каждая строка представляет собой список названий видов, разделенных запятыми (т. Е. Род видов). Каждая строка может содержать переменное количество видов (например, как показано в примере ниже, количество видов в данной строке варьируется от 1 до 3).
trees <- c("Erythrina poeppigiana", "Erythrina poeppigiana, Juglans regia x Juglans nigra", "Erythrina poeppigiana, Juglans regia x Juglans nigra, Chloroleucon eurycyclum")
Я хочу получить вектор символьных строк одинаковой длины, но где каждая строка представляет собой список разделенных запятыми только частей родов имен
genera <- c("Erythrina", "Erythrina, Juglans", "Erythrina, Juglans, Chloroleucon")
Виноградный вид - это гибрид гибридов "Juglans regia x Juglans nigra". Это должно получиться просто как «Juglans», так как все это заключено между двумя запятыми и, следовательно, является всего лишь одним видом. В таких гибридах род всегда один и тот же по обе стороны от «x», поэтому достаточно первого слова в этой части строки, как и в более стандартных случаях. Однако решения, которые пытаются вытащить «каждое слово», не будут работать из-за этих гибридов.
Моя попытка заключалась в том, чтобы сначала разделить strsplit на ",", чтобы выделить отдельные названия видов, а затем снова strsplit на "", чтобы выделить названия родов:
split.list <- sapply(strsplit(trees, split=", "), strsplit, 1, split=" ")
split.list
[[1]]
[[1]][[1]]
[1] "Erythrina" "poeppigiana"
[[2]]
[[2]][[1]]
[1] "Erythrina" "poeppigiana"
[[2]][[2]]
[1] "Juglans" "regia" "x" "Juglans" "nigra"
[[3]]
[[3]][[1]]
[1] "Erythrina" "poeppigiana"
[[3]][[2]]
[1] "Juglans" "regia" "x" "Juglans" "nigra"
[[3]][[3]]
[1] "Chloroleucon" "eurycyclum"
Но тогда индексация для извлечения названий родов и рекомбинации довольно сложна (и я даже не могу это понять!). Есть ли более чистое решение для упорядоченного разделения и рекомбинации?
Также было бы приемлемо использовать тот факт, что названия родов - единственные слова, которые пишутся с заглавной буквы во всей строке. Может быть, регулярное выражение, которое вытягивает только слова с заглавными буквами?
trees <- list(c("Erythrina poeppigiana"), c("Erythrina poeppigiana", "Terminalia amazonia"), c("Erythrina poeppigiana", "Terminalia amazonia", "Chloroleucon eurycyclum"))
. - person lmo   schedule 24.02.2017