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 == x
crea un vector lógico que es VERDADERO en cada ubicación en la que x ocurre, y cuando sesum
ing, 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
x
los 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)
deplyr
paquete. Mucho más conveniente quetable
en mi opinión.fuente
Mi solución preferida usa
rle
, que devolverá un valor (la etiqueta,x
en su ejemplo) y una longitud, que representa cuántas veces ese valor apareció en secuencia.Al combinar
rle
consort
, 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
a
undata.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.table
es 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
tabulate
es que no puedes lidiar con números cero y negativos.tabulate
. Nota:sort
parece 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
sapply
funció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
:table
es ú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
rle
propuesta 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
NA
esplyr::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
outer
para obtener una metrix de igualdades seguida derowSums
un significado obvio.Para tener los recuentos y
numbers
en el mismo conjunto de datos, primero se crea un data.frame. Este paso no es necesario si desea entradas y salidas separadas.fuente