Tenho os seguintes dados para os quais estou tentando dividir de 1 para a última seção de números por a -
. Meus dados são os seguintes;
dat
"4-3" "60-0 2-5" "10-1 3-2" "20-2 3-0" "3-0" "20-5 3-0"
O que estou tentando arquivar é que estamos adicionando separadamente 1 ao último número e 1 ao penúltimo número;
dat1
"5-3" "60-0 3-5" "10-1 4-2" "20-2 4-0" "4-0" "20-5 4-0"
dat2
"4-4" "60-0 2-6" "10-1 3-3" "20-2 3-1" "3-1" "20-5 3-1"
Acho que pode ser possível dividir os dados usando um gsub(), embora isso possa ser complicado, pois meus dados variam em comprimento entre 1 conjunto de números e 2, meu outro problema é que se eu usar um gsub, não consigo somar (até onde eu saiba). Minha teoria seria algo como identificar o último número e adicionar 1, então identificar o segundo último número e adicionar 1
1) gsubfn
gsubfn
é comogsub
exceto que o argumento de substituição pode ser uma função e, como aqui, pode ser opcionalmente expresso usando uma notação de fórmula compacta. Os grupos de captura na expressão regular são passados para a função e as variáveis livres no corpo são atribuídas a eles em ordem de ocorrência. A saída da função então substitui a parte correspondida pela expressão regular.2) Base R Usando apenas a base R, divida cada componente de
dat
por separadores não-dígitos, dando uma lista de vetores de caracteres, um desses vetores por componente dedat
. Em seguida, apliqueplus1
a cada componente, ou seja, cada vetor de caracteres, na lista. Para cada um, converta-o em um vetor numériconum
e, em seguida, incremente seu k-ésimo último elemento, onde k = 1 significa o último elemento e k=2 significa o segundo último. Finalmente, cole-o novamente inserindo os sinais de menos e espaços.Observação
Podemos usar
paste0
nossa nova string usando uma função que encontra o caractere de comprimento n em uma string e adiciona a1
a ela. Que é a maneira mais precisa que consegui encontrar, embora meu cérebro quase tenha entrado em colapso enquanto escrevia.Você pode usar
sub
+paste0
como abaixotal que
Além disso, você pode encapsular tudo em uma função personalizada, onde
idx=1
significa o último número eidx=2
significa o último segundo númerotal que
Você também pode usar
str_replace_all
fromstringr
:Fazendo o mesmo no Base R: