我有一个数据框sp
,其中包含多个物种名称,但由于它们来自不同的数据库,因此它们以不同的方式编写。
例如,一种物种可称为 Urtica dioica 和 Urtica dioica L. 。
为了解决这个问题,我使用下面的代码,它只提取一行中的两个第一个单词:
paste(strsplit(sp[i,"sp"]," ")[[1]][1],strsplit(sp[i,"sp"]," ")[[1]][2],sep=" ")
目前,此代码已集成在for
循环中,该循环有效,但需要很长时间才能完成:
for (i in seq_along(sp$sp)) {
sp[i,"sp2"] = paste(strsplit(sp[i,"sp"]," ")[[1]][1],
strsplit(sp[i,"sp"]," ")[[1]][2],
sep=" ")
}
如果有办法使用向量或应用函数改进这个基本代码吗?
答案 0 :(得分:1)
您可以使用矢量化正则表达式函数:
library(stringr)
x <- c("Urtica dioica", "Urtica dioica L.")
> str_extract(string = x,"\\w+ \\w+")
[1] "Urtica dioica" "Urtica dioica"
我碰巧在这里找到了 stringr 方便,但是对于您的特定数据使用正确的正则表达式,您可以使用gsub
等基本函数执行此操作。
答案 1 :(得分:0)
在进行每次提取之前,您可能需要检查字符串中是否有超过2个单词:
if((sapply(gregexpr("\\W+", i), length) + 1) > 2){
...
}
答案 2 :(得分:0)
这是一个功能。
同样来自stringr
,word
函数
> choices <- c("Urtica dioica", "Urtica dioica L..")
> library(stringr)
> word(choices, 1:2)
# [1] "Urtica" "dioica"
> word(choices, rep(1:2, 2))
# [1] "Urtica" "dioica" "Urtica" "dioica"
这些返回单个字符串。对于包含名字和姓氏的两个字符串,
> word(choices, 1, 2)
# [1] "Urtica dioica" "Urtica dioica"
最后一行从向量choices