Comecei com um exemplo simples que funciona, mas não sei como usar dentro do dplyr mutate
Isso funciona, recebo "bcd-234":
library(tidyverse)
list = c("abc-123", 'bcd-234', 'cde-345', 'bcd-987')
s = 'bcd'
list[str_detect(list, s)][1]
mas quando tento usá-lo dentro do dplyr mutate recebo um erro:
df <- tibble(
name = c('aaa', 'bbb', 'ccc', 'ddd', 'abc', 'bcd', 'cde')
)
df |> mutate(
new_name = if_else(any(str_detect(list, name)), list[str_detect(list, name)][1], name)
)
Recebo um erro:
! Can't recycle `string` (size 4) to match `pattern` (size 7).
Obrigado
PS: evite usar lista como nome de variável.
Infelizmente, o base
R
'smatch()
, e mais relevante aqui,charmatch()
, não pode lidar com múltiplas correspondências.Podemos usar
replace
++ e ++ para evitar .%in%
substr
sapply
toString
grepv
i
dplyr::rowwise
Observação sobre
grepv()
. Esta é uma nova função introduzida emR 4.5.0
( How About a Twenty-Six ), lançada em 11 de abril de 2025. É "idêntica a,grep()
exceto pelo padrãovalue=TRUE
", vejaR
NOTÍCIAS . (E agora anunciada no SO.)Dados
Dados do OP nomeados de forma mais apropriada.
No R básico, poderíamos empregar
startsWith
emouter
, nomesreplace
correspondentes com respectivas strings; fornece o resultado.diag()
onde
Se você precisar de uma
"list"
coluna, adaptamos um pouco:onde
Dados: