多个有序的strsplit,然后重新组合

时间:2017-02-24 14:02:14

标签: r sapply strsplit

给定一个字符串向量,其中每个字符串是以逗号分隔的物种名称列表(即属种)。每个字符串中可以包含可变数量的种类(例如,如下面的示例所示,给定字符串中的种类数量范围为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")

螺旋状物种是&#34; Juglans regia x Juglans nigra&#34; hyrbid物种。这应该只是出现在&#34; Juglans&#34;,因为它全部包含在两个逗号之间,因此只是一个物种。在像这样的混合类中,属性在&#34; x&#34;的两侧总是相同的,所以只是字符串那部分中的第一个单词很好,就像更标准的情况一样。然而,试图解决所有其他词的解决方案&#34;由于这些混合动力车而无法工作。

我的尝试是第一次被&#34;,&#34;将各个物种的名称分开,然后再通过&#34; &#34;分离出属名:

    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"

但是接下来索引属性名称并重新组合是非常复杂的(我甚至无法弄清楚它!)。对于有序的拆分和重组,是否有更清洁的解决方案?

利用属名是唯一在所有字符串中大写的单词这一事实也是可以接受的。也许一个正则表达式只用大写字母来表达单词?

1 个答案:

答案 0 :(得分:2)

这是通过Base R的想法,

sapply(strsplit(trees, ' '), function(i) toString(i[c(TRUE, FALSE)]))
#[1] "Erythrina"    "Erythrina, Terminalia"         "Erythrina, Terminalia, Chloroleucon"

修改

对于您的评论,对于新的trees,您可以这样做,

sapply(strsplit(trees, ', '), function(i) toString(sub('\\s+.*', '', i)))
#[1] "Erythrina, Juglans"               "Erythrina"                       
#[3] "Erythrina, Juglans, Chloroleucon"