Tenho um problema muito parecido para resolver assim . No entanto, não estou interessado em classificar. Estou interessado em agrupar (palavra errada talvez) os mesmos objetos de string juntos e somar o valor anexado com string. Em segundo lugar, gostaria de remover uma string das linhas. Preparei um quadro de dados de exemplo. Preparei isso o mais próximo possível do post que mencionei anteriormente.
branch <- c("OL", "CA", "PL", "OR", "FL")
perf <- c("Mattheu (12), Jessica (32), Mattheu (22), Tom (10), HQ",
"Tobias (13), Kurt (22), Mathias (44), HQ, Tobias (55)",
"Tom (30), HQ, Giti (88), Patel (54), Tom (12), Tom (10)",
"Harry (1), Potter (32), Harry (2)",
"Timothy (3), HQ, Sara (44), HQ"
)
> performance <- data.frame(branch, perf)
> performance
branch perf
1 OL Mattheu (12), Jessica (32), Mattheu (22), Tom (10), HQ
2 CA Tobias (13), Kurt (22), Mathias (44), HQ, Tobias (55)
3 PL Tom (30), HQ, Giti (88), Patel (54), Tom (12), Tom (10)
4 OR Harry (1), Potter (32), Harry (2)
5 FL Timothy (3), HQ, Sara (44), HQ
Na primeira linha, tenho Mattheu duas vezes. Quero tê-lo uma vez com os números somados. Isso significa que deve ser Mattheu (34). Em segundo lugar, gostaria de remover a string HQ.
Esta é a expectativa de saída da segunda coluna:
[1] "Mattheu (34), Jessica (32), Tom (10)"
[2] "Tobias (68), Kurt (22), Mathias (44)"
[3] "Tom (52), Giti (88), Patel (54)"
[4] "Harry (3), Potter (32)"
[5] "Timothy (3), Sara (44)"
Como obter o resultado esperado?
Aqui está uma opção usando
dplyr
umatidyr
biblioteca.separate_longer_delim
com base em ", "name
escore
). O regex usado aqui é importante para identificar corretamente os valoresname
escore
.sum
os valores para cada umname
ebranch
name
para obter o formato original.Na base R você poderia fazer
dando
regmatches
encontra todos os elementos que têm algum texto e depois algum número entre colchetes() e os armazena em um vetor: "Mattheu (12)" "Jessica (32)" "Mattheu (22)" "Tom (10)"gsub(" \\(\\d+\\)", "", matches)
substitui todos os "(número)" por nada (""), de modo que apenas os nomes permaneçam: "Mattheu (22)" -> "Mattheu"as.numeric(gsub("[^0-9]", "", matches))
extrai qualquer número de uma string e o converte em um número R "Tom (10)" --> 10aggregate(count ~ names, data = df, FUN = sum)
resume nomes semelhantes em uma célula de contagem. Ele basicamente resume linhas com nomes semelhantespaste0(result$names, " (", result$count, ")", collapse = ", ")
finalmente cola todos os nomes agregados e conta novamente como uma string:paste0(c("name1", "name2"), " (", c(1, 2), ")", collapse = ", ")
--> "nome1 (1), nome2 (2)"sapply(performance$perf, sum_similar)
finalmente aplica esta função a todas as linhas (cada string da coluna "perf")Explicação
Primeiro, poderíamos
strsplit
em', '
. Sobre a lista resultante, temossapply
uma funçãog()
quegsub
s os parênteses afastados,grep
s aqueles com números,strsplit
s em espaços,rbind
s etype.convert
s,xtab
s, e finalmentesprintf
s o resultado desejado separado por vírgulas usando `toString().O OP não especificou realmente como as strings deveriam ser classificadas, então aqui está a classificação alfabética.
Criado em 2025-02-06 com reprex v2.1.1