Tengo un vector de números:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
453,435,324,34,456,56,567,65,34,435)
¿Cómo puedo hacer que R cuente la cantidad de veces que aparece un valor x en el vector?
Solo puedes usar table():
> a <- table(numbers)
> a
numbers
4 5 23 34 43 54 56 65 67 324 435 453 456 567 657
2 1 2 2 1 1 2 1 2 1 3 1 1 1 1
Entonces puedes subconjuntarlo:
> a[names(a)==435]
435
3
O conviértalo en un data.frame si se siente más cómodo trabajando con eso:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
a["435"]lugar dea[names(a)==435]?La forma más directa es
sum(numbers == x).numbers == xcrea un vector lógico que es VERDADERO en cada ubicación en la que x ocurre, y cuando sesuming, el vector lógico se convierte en numérico, lo que convierte VERDADERO en 1 y FALSO en 0.Sin embargo, tenga en cuenta que los números de coma flotante que es mejor usar algo como:
sum(abs(numbers - x) < 1e-6).fuente
xlos datos en lugar de un valor conocido específico dex. Para ser justos, de eso se trataba la pregunta original. Como dije en mi respuesta a continuación, "Encuentro que es raro que quiera saber la frecuencia de un valor y no todos los valores ..."Probablemente haría algo como esto
Pero realmente, una mejor manera es
fuente
table(numbers)va a hacer mucho más trabajo que la solución más fácilsum(numbers==x), porque también va a calcular los recuentos de todos los otros números en la lista.También hay
count(numbers)deplyrpaquete. Mucho más conveniente quetableen mi opinión.fuente
Mi solución preferida usa
rle, que devolverá un valor (la etiqueta,xen su ejemplo) y una longitud, que representa cuántas veces ese valor apareció en secuencia.Al combinar
rleconsort, tiene una forma extremadamente rápida de contar la cantidad de veces que apareció cualquier valor. Esto puede ser útil con problemas más complejos.Ejemplo:
Si el valor que desea no aparece, o necesita almacenar ese valor para más adelante, haga
aundata.frame.Creo que es raro que quiera saber la frecuencia de un valor y no todos los valores, y rle parece ser la forma más rápida de contarlos y almacenarlos todos.
fuente
c(rep('A', 3), rep('G', 4), 'A', rep('G', 2), rep('C', 10))volveríavalues = c('A','G','A','G','C')ylengths=c(3, 4, 1, 2, 10)que a veces es útil.tablees más rápidowhen the vector is long(intenté con 100000) pero un poco más largo cuando fue más corto (intenté con 1000)Hay una función estándar en R para eso
tabulate(numbers)fuente
tabulatees que no puedes lidiar con números cero y negativos.tabulate. Nota:sortparece ser necesario para su correcto uso en general:tabulate(sort(numbers)).fuente
Aquí hay una manera rápida y sucia:
fuente
Si desea contar el número de apariciones posteriormente, puede utilizar la
sapplyfunción:Salida:
fuente
Puede cambiar el número a lo que desee en la siguiente línea
fuente
Una forma más que encuentro conveniente es:
Esto convierte el conjunto de datos en factor, y luego summary () nos da los totales de control (recuentos de los valores únicos).
Salida es:
Esto se puede almacenar como marco de datos si se prefiere.
aquí row.names se ha utilizado para renombrar nombres de fila. sin usar row.names, los nombres de columna en s se usan como nombres de fila en el nuevo marco de datos
Salida es:
fuente
Usando la tabla pero sin comparar con
names:tablees útil cuando usa los recuentos de diferentes elementos varias veces. Si solo necesita un recuento, usesum(numbers == x)fuente
Hay diferentes formas de contar elementos específicos.
fuente
Un método que es relativamente rápido en vectores largos y proporciona una salida conveniente es usar
lengths(split(numbers, numbers))(tenga en cuenta la S al final delengths):La salida es simplemente un vector con nombre.
La velocidad parece comparable a la
rlepropuesta por JBecker e incluso un poco más rápida en vectores muy largos. Aquí hay un microbenchmark en R 3.6.2 con algunas de las funciones propuestas:Es importante destacar que la única función que también cuenta el número de valores faltantes
NAesplyr::count. Estos también se pueden obtener por separado usandosum(is.na(vec))fuente
Esta es una solución muy rápida para vectores atómicos unidimensionales. Se basa
match(), por lo que es compatible conNA:También puede ajustar el algoritmo para que no se ejecute
unique().En los casos en que ese resultado es deseable, probablemente ni siquiera lo necesite para volver a devolver el vector original, y la segunda columna es probablemente todo lo que necesita. Puede obtener eso en una línea con la tubería:
fuente
Esto se puede hacer
outerpara obtener una metrix de igualdades seguida derowSumsun significado obvio.Para tener los recuentos y
numbersen el mismo conjunto de datos, primero se crea un data.frame. Este paso no es necesario si desea entradas y salidas separadas.fuente