AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79594325
Accepted
Shreko
Shreko
Asked: 2025-04-27 03:36:47 +0800 CST2025-04-27 03:36:47 +0800 CST 2025-04-27 03:36:47 +0800 CST

dplyr: descobre se um valor de coluna é uma substring de qualquer item em uma lista fixa e altera o valor

  • 772

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

  • 3 3 respostas
  • 76 Views

3 respostas

  • Voted
  1. Best Answer
    s_baldur
    2025-04-27T03:47:51+08:002025-04-27T03:47:51+08:00
    res <- df |>
      rowwise() |>
      mutate(
        new_name = if (any(str_detect(list, name))) list(list[str_detect(list, name)]) else list(name)
      )
    
    > res
    #   name  new_name 
    #   <chr> <list>   
    # 1 aaa   <chr [1]>
    # 2 bbb   <chr [1]>
    # 3 ccc   <chr [1]>
    # 4 ddd   <chr [1]>
    # 5 abc   <chr [1]>
    # 6 bcd   <chr [2]>
    # 7 cde   <chr [1]>
    
    > as.data.frame(res)
      name         new_name
    1  aaa              aaa
    2  bbb              bbb
    3  ccc              ccc
    4  ddd              ddd
    5  abc          abc-123
    6  bcd bcd-234, bcd-987
    7  cde          cde-345
    

    PS: evite usar lista como nome de variável.

    • 2
  2. 2025-04-27T05:51:13+08:002025-04-27T05:51:13+08:00

    Infelizmente, o base R's match(), e mais relevante aqui, charmatch(), não pode lidar com múltiplas correspondências.

    Podemos usar replace++ e ++ para evitar .%in%​substrsapplytoStringgrepvidplyr::rowwise

    i = X$name %in% substr(l, 1, 3)
    X$new_name = replace(X$name, i, sapply(X$name[i], \(j) toString(grepv(j, l))))
    
    > X
      name         new_name
    1  aaa              aaa
    2  bbb              bbb
    3  ccc              ccc
    4  ddd              ddd
    5  abc          abc-123
    6  bcd bcd-234, bcd-987
    7  cde          cde-345
    

    Observação sobre grepv(). Esta é uma nova função introduzida em R 4.5.0( How About a Twenty-Six ), lançada em 11 de abril de 2025. É "idêntica a, grep()exceto pelo padrão value=TRUE", veja RNOTÍCIAS . (E agora anunciada no SO.)


    Dados

    Dados do OP nomeados de forma mais apropriada.

    > dput(X)
    structure(list(name = c("aaa", "bbb", "ccc", "ddd", "abc", "bcd", 
    "cde")), class = "data.frame", row.names = c(NA, -7L))
    > dput(l)
    c("abc-123", "bcd-234", "cde-345", "bcd-987")
    
    • 1
  3. jay.sf
    2025-04-27T18:30:20+08:002025-04-27T18:30:20+08:00

    No R básico, poderíamos empregar startsWithem outer, nomesreplace correspondentes com respectivas strings; fornece o resultado.diag()

    > res1 <- df |> 
    +   transform(
    +     new_name=outer(a, name, Vectorize(startsWith)) |> 
    +       apply(2, \(i) replace(name, i, toString(a[i]))) |> 
    +       diag()
    +   ) |> print()
      name         new_name
    1  aaa              aaa
    2  bbb              bbb
    3  ccc              ccc
    4  ddd              ddd
    5  abc          abc-123
    6  bcd bcd-234, bcd-987
    7  cde          cde-345
    

    onde

    > str(res1)
    'data.frame':   7 obs. of  2 variables:
     $ name    : chr  "aaa" "bbb" "ccc" "ddd" ...
     $ new_name: chr  "aaa" "bbb" "ccc" "ddd" ...
    

    Se você precisar de uma "list"coluna, adaptamos um pouco:

    > res2 <- df |> 
    +   base::`$<-`('new_name', outer(a, name, Vectorize(startsWith)) |> 
    +       apply(2, \(i) replace(name, i, list(a[i]))) |> 
    +       list2DF() |> 
    +       as.matrix() |> diag()
    +   ) |> print()
      name         new_name
    1  aaa              aaa
    2  bbb              bbb
    3  ccc              ccc
    4  ddd              ddd
    5  abc          abc-123
    6  bcd bcd-234, bcd-987
    7  cde          cde-345
    

    onde

    > str(res2)
    'data.frame':   7 obs. of  2 variables:
     $ name    : chr  "aaa" "bbb" "ccc" "ddd" ...
     $ new_name:List of 7
      ..$ : chr "aaa"
      ..$ : chr "bbb"
      ..$ : chr "ccc"
      ..$ : chr "ddd"
      ..$ : chr "abc-123"
      ..$ : chr  "bcd-234" "bcd-987"
      ..$ : chr "cde-345"
    

    Dados:

    > dput(df)
    structure(list(name = c("aaa", "bbb", "ccc", "ddd", "abc", "bcd", 
    "cde")), row.names = c(NA, -7L), class = "data.frame")
    
    a <- c("abc-123", 'bcd-234', 'cde-345', 'bcd-987')
    
    • 1

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve