使用字符串简化加速r中的循环

时间:2014-07-24 15:08:32

标签: r for-loop strsplit

我有一个数据框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=" ")
}

如果有办法使用向量或应用函数改进这个基本代码吗?

3 个答案:

答案 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)

这是一个功能。

同样来自stringrword函数

> 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

中的每个字符串中获取前两个单词