Tengo un data.frame en el que ciertas variables contienen una cadena de texto. Deseo contar el número de ocurrencias de un carácter dado en cada cadena individual.
Ejemplo:
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"))
Deseo crear una nueva columna para q.data con el número de apariciones de "a" en la cadena (es decir, c (2,1,0)).
El único enfoque complicado que he logrado es:
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 = FALSEal definir el marco de datos.stringsAsFactors=TRUEen mi comp, pero no mencionó esteSi no desea dejar la base R, aquí hay una posibilidad bastante sucinta y expresiva:
fuente
regmatchesygregexprjuntos unas cuantas veces, pero ese combo es lo suficientemente poderoso como para pensar que merecía un complemento.regmatcheses relativamente nuevo. Fue introducido en 2.14.Observe que forzo la variable factor a carácter, antes de pasar a nchar. Las funciones de expresiones regulares parecen hacer eso internamente.
Estos son los resultados de referencia (con un tamaño ampliado de la prueba a 3000 filas)
fuente
fixed=TRUEagsub. También hay casos en losfixed=TRUEque sería necesario (es decir, cuando el carácter que desea contar podría interpretarse como una aserción de expresiones regulares como.).es una buena opción.
fuente
El
stringipaquete proporciona las funcionesstri_countystri_count_fixedque son muy rápidas.punto de referencia
Comparado con el enfoque más rápido de la respuesta de @ 42- y con la función equivalente del
stringrpaquete para un vector con 30.000 elementos.datos
fuente
Una variación de https://stackoverflow.com/a/12430764/589165 es
fuente
Estoy seguro de que alguien puede hacerlo mejor, pero esto funciona:
o en una función:
fuente
Podrías usar la división de cuerdas
Lo que le dará 1, 3, 1, 0. También puede usar la división de cadenas con expresiones regulares y palabras completas.
fuente
La forma más fácil y limpia en mi humilde opinión es:
fuente
lengths(gregexpr('a', q.data$string))devuelve2 1 1, no2 1 0.La siguiente pregunta se ha trasladado aquí, pero parece que esta página no responde directamente a la pregunta de Farah El. Cómo encontrar el número 1 en 101 en R
Entonces, escribiré una respuesta aquí, por si acaso.
https://stackoverflow.com/users/8931457/farah-el
fuente
Otra
base Ropción más podría ser:fuente
La siguiente expresión hace el trabajo y también funciona para símbolos, no solo letras.
La expresión funciona de la siguiente manera:
fuente
Puede que no sea el eficiente, pero resuelve mi propósito.
fuente