Tenho uma variável de ID que vem de 35 hospitais diferentes, então tem arranjos diferentes da variável e, às vezes, tem o mesmo número de ID raiz com um número de linha secundário - por exemplo, -1, /a, _1 etc.
Quero remover a pontuação e tudo o que vier depois dela, deixando apenas o número de ID raiz.
No momento, consegui escrever linhas individuais de código para cada iteração diferente, mas queria saber se há uma maneira mais elegante para que, no ano que vem, quando os dados chegarem, eu não precise verificar arranjos diferentes?
Na pergunta de outra pessoa, consegui encontrar uma maneira de remover os colchetes e todo o texto dentro dos colchetes, mas não consigo descobrir como manipulá-lo para meus propósitos
df$patid<- gsub("\\s*\\([^\\)]+\\)","",df$patid)
Eu tentei esses dois códigos sem sucesso
df$patid<- gsub("\\[:punct:]s*$","", df$patid)
df$patid<- gsub("\\[:alnum:]s*$","", df$patid)
Também tentei a clean
função que removeu toda a pontuação, mas manteve os números/caracteres depois delas, então não foi isso.
exemplo do meu código atual (nem todas as iterações possíveis) - Estas funcionam
df$patid<- gsub("\\-1$", "", df$patid)
df$patid<- gsub("\\-2$", "", df$patid)
df$patid<- gsub("\\-3$", "", df$patid)
df$patid<- gsub("\\-a$", "", df$patid)
df$patid<- gsub("\\-A$", "", df$patid)
df$patid<- gsub("\\-b$", "", df$patid)
df$patid<- gsub("\\-B$", "", df$patid)
df$patid<- gsub("\\b", "", df$patid)
df$patid<- gsub("\\/dd", "", df$patid)
Não estou preso a gsub
, estou aberto a diferentes métodos.
Exemplo de números de identificação
patid<- c("MB-13-169454", "MB-13-179455", "MB-13-212235.1", "MB-13-212235.2", "MB-13-224683", "570548260-2", "570548260-3", "1458629P-2", "1139093D-2", "8253015N/2", "8253015N/3", "M255858/1", "M255858/2", "8494392Q/2", "9296741B/2", "04152341421/A", "04152341421/B", "04152640475/B", "04152821164/A", "G140381883_1", "G140381883_2", "G140880774_1", "G140880774_2")
Peço desculpas se isso já foi respondido em algum lugar
Uma expressão regular literal para o que você descreveu seria:
Isso corresponderia a um caractere de pontuação final, seguido por qualquer coisa que o siga, até o final da string.
O que você pede é remover qualquer pontuação e, em seguida, um único caractere alfanumérico no final da string .
Veja a demonstração do R. O
[[:punct:]][[:alnum:]]$
padrão compatível com TRE corresponde a um caractere de pontuação, depois a um alfanumérico e, então, afirma se há um fim de string logo após esse caractere alfanumérico. Veja a demonstração do regex .Para remover qualquer pontuação E o texto depois dela no final da string , você pode usar
NOTA : Você também pode usar o mesmo padrão com
stringr::str_replace_all
function. Além disso, você deve usarperl=TRUE
ingsub
para fazer esse padrão funcionar, pois ele é compatível com PCRE, não com TRE.Veja a demonstração do regex .
Detalhes :
[\p{S}\p{P}]+
- um ou mais símbolos matemáticos ou caracteres de pontuação adequados (observe que o mecanismo padrão usa uma versão compatível com POSIX que[:punct:]
inclui essas duas classes de categoria Unicode, mas o mecanismo regex ICU usado emstringr
funções regex não é compatível com POSIX e se comporta de forma diferente, é por isso que estou sugerindo esse padrão)[^\p{S}\p{P}]*
- zero ou mais caracteres além de símbolos matemáticos ou caracteres de pontuação adequados$
- fim da string.Veja a demonstração do R online :
Saída:
Informações adicionais que podem confundir você: