Векторизованный str_locate не работает должным образом - PullRequest
2 голосов
/ 07 мая 2020

У меня есть следующий фрейм данных:

df <- data.frame(string=c('abcde', 'cde'))

Я хочу найти конец позицию «de» в каждой строке, которую я могу определить так:

df %>% 
 rowwise() %>%
 mutate(pos=str_locate(string = string, pattern = "de")[2])

##   string    pos
##    abcde      5
##      cde      3

Это предполагаемый результат , но Я не хочу sh использовать rowwise(), потому что это очень медленно для больших фреймов данных.

Итак, я попытался векторизовать свою функцию и удалить команду rowwise():

Vstr_locate <- Vectorize(str_locate)

df %>% 
 #rowwise() %>%
 mutate(pos=Vstr_locate(string = string, pattern = "de")[2])

Но это не сработало:

##   string    pos
##    abcde      5
##      cde      5

Вопросы:

  • Почему не работает моя векторизованная функция?
  • Как я могу получить желаемый результат без использования rowwise()?

Ответы [ 2 ]

4 голосов
/ 07 мая 2020

str_locate уже векторизовано, rowwise или Vectorize не требуется:

df %>% mutate(pos=str_locate(string = string, pattern = "de")[, 2])
#   string pos
# 1  abcde   5
# 2    cde   3
2 голосов
/ 07 мая 2020

Вам нужна запятая в скобках

df %>% 
  #rowwise() %>%
  mutate(pos=Vstr_locate(string = string, pattern = "de")[2,])
  string pos
1  abcde   5
2    cde   3

Посмотрите на результаты двух функций

str_locate(string = "abcde", pattern = "de")
     start end
[1,]     4   5

vs.

Vstr_locate(string = "abcde", pattern = "de")
     abcde
[1,]     4
[2,]     5

Аналогично, если вы применяете каждый по списку

library(purrr)
strings <- c('abcde', 'cde')
map(strings, str_locate, "de")
[[1]]
     start end
[1,]     4   5

[[2]]
     start end
[1,]     2   3

против

map(strings, Vstr_locate, "de")
[[1]]
     abcde
[1,]     4
[2,]     5

[[2]]
     cde
[1,]   2
[2,]   3

Требуемый элемент индексируется как [2,] с Vstr_locate

...