Eu tenho um data.frame no qual certas variáveis contêm uma string de texto. Desejo contar o número de ocorrências de um determinado caractere em cada string individual.
Exemplo:
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"))
Desejo criar uma nova coluna para q.data com o número de ocorrências de "a" na string (ou seja, c (2,1,0)).
A única abordagem complicada que consegui é:
string.counter<-function(strings, pattern){
counts<-NULL
for(i in 1:length(strings)){
counts[i]<-length(attr(gregexpr(pattern,strings[i])[[1]], "match.length")[attr(gregexpr(pattern,strings[i])[[1]], "match.length")>0])
}
return(counts)
}
string.counter(strings=q.data$string, pattern="a")
number string number.of.a
1 1 greatgreat 2
2 2 magic 1
3 3 not 0
stringsAsFactors = FALSE
ao definir o quadro de dados.stringsAsFactors=TRUE
no meuSe você não quiser deixar a base R, aqui está uma possibilidade bastante sucinta e expressiva:
fonte
regmatches
egregexpr
juntos algumas vezes, mas esse combo é poderoso o suficiente para que eu achei que merecia um plug.regmatches
é relativamente novo. Foi introduzido em 2.14.Observe que eu forço a variável de fator a caractere, antes de passar para nchar. As funções regex parecem fazer isso internamente.
Aqui estão os resultados do benchmark (com um tamanho ampliado do teste para 3.000 linhas)
fonte
fixed=TRUE
paragsub
. Também há casos em quefixed=TRUE
isso seria necessário (ou seja, quando o caractere que você deseja contar pode ser interpretado como uma afirmação de regex, como.
).é uma boa opção.
fonte
O
stringi
pacote oferece as funçõesstri_count
estri_count_fixed
que são muito rápidas.benchmark
Comparado com a abordagem mais rápida da resposta de @ 42-'s e com a função equivalente do
stringr
pacote para um vetor com 30.000 elementos.dados
fonte
Uma variação de https://stackoverflow.com/a/12430764/589165 é
fonte
Tenho certeza que alguém pode fazer melhor, mas isso funciona:
ou em uma função:
fonte
Você poderia apenas usar a divisão de string
O que lhe dará 1, 3, 1, 0. Você também pode usar a divisão de string com expressões regulares e palavras inteiras.
fonte
A maneira mais fácil e limpa de IMHO é:
fonte
lengths(gregexpr('a', q.data$string))
retorna2 1 1
, não2 1 0
.A pergunta abaixo foi movida para cá, mas parece que esta página não responde diretamente à pergunta de Farah El. Como encontrar o número 1 em 101 em R
Então, vou escrever uma resposta aqui, apenas no caso.
https://stackoverflow.com/users/8931457/farah-el
fonte
Ainda outra
base R
opção poderia ser:fonte
A próxima expressão faz o trabalho e também funciona para símbolos, não apenas letras.
A expressão funciona da seguinte maneira:
fonte
Pode não ser o eficiente, mas resolve meu propósito.
fonte