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 = FALSE
al definir el marco de datos.stringsAsFactors=TRUE
en mi comp, pero no mencionó esteSi no desea dejar la base R, aquí hay una posibilidad bastante sucinta y expresiva:
fuente
regmatches
ygregexpr
juntos unas cuantas veces, pero ese combo es lo suficientemente poderoso como para pensar que merecía un complemento.regmatches
es 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=TRUE
agsub
. También hay casos en losfixed=TRUE
que 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
stringi
paquete proporciona las funcionesstri_count
ystri_count_fixed
que 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
stringr
paquete 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 R
opció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