2016-03-21 1 views
0

Я пытаюсь написать функцию, которая принимает вектор, ищет элементы внутри этого вектора, которые содержат определенную строку, и заменяет весь текст этого элемента первым словом в исходном элементе.Как искать символьный вектор для строки и где ИСТИНА заменить весь элемент частью исходного элемента?

, например, у меня есть:

vec <- c("eolimna pala", "achnanthes lata", "navicula spp.", "diploneis spp. 2") 

и я хотел бы получить:

vec <- c("eolimna pala", "achnanthes lata", "navicula", "diploneis") 

это более или менее то, что я есть. Буду признателен за любую оказанную помощь. EDIT: было бы еще более полезно, если бы я мог представить в качестве аргумента символьный вектор из нескольких строк для проверки каждого элемента.

rollToGenus <- function (vec) { 

    greps <- grepl(" spp. ", as.character(vec)) 

    for (i in 1:length(vec)) { 
    if (greps[i] == TRUE) { 
     paste(str_split_fixed(i, " ", n=6)[1]) 
    } 
    } 
} 
+0

Почему 'a' и' b' включены в выход? у них нет spp. – MichaelChirico

+0

Я хочу, чтобы результат был исходным вектором, но с заменой. – bishopia

ответ

1

Разве это не просто следующее:

gsub(" spp\\..*$", "", vec) 
# [1] "eolimna pala" "achnanthes lata" "navicula"  "diploneis" 

EDIT: gsub заменяет (регулярное выражение) модели в строках. " spp\\..*$" ищет все " spp." (\\. избегает . что означает любой символ), за которой следует любой символ . ноль/несколько раз * сезам конца строки $.

Ваше решение делает практически то же самое (но использует ifelse и grepl для вещей, которые [g]sub может сделать в одиночку). Вот почему мое решение выглядит более чистым и должно быть быстрее:

library("microbenchmark") 
vec <- c("eolimna pala", "achnanthes lata", "navicula spp.", "diploneis spp. 2") 
all.equal(gsub(" spp\\..*$", "", vec), 
      ifelse(grepl(" spp.", vec, fixed = TRUE), sub(" .*", "", vec), vec)) 
# [1] TRUE 

microbenchmark(gsub=gsub(" spp\\..*$", "", vec), 
       ifelse=ifelse(grepl(" spp.", vec, fixed = TRUE), sub(" .*", "", vec), vec)) 
# Unit: microseconds 
# expr min  lq  mean median  uq  max neval 
# gsub 23.301 24.1305 26.39183 25.599 26.168 56.770 100 
# ifelse 49.791 51.1235 56.00751 51.760 52.576 170.134 100 
+0

Я довольно плохой со струнным материалом. не могли бы вы объяснить это немного больше и почему это было бы лучше, чем ответ, который я разместил чуть ниже? – bishopia

+0

@bishopia см. Мое редактирование – sgibb

0

Кто-то разместил это, а затем удалил. это сработало для меня.

ifelse(grepl(" spp.", vec, fixed = TRUE), sub(" .*", "", vec), vec) 
Смежные вопросы