Contar el número de elementos con los valores de x en un vector
Pregunta
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 tener R contar el número de veces que un valor x aparece en el vector?
Solución
Puede utilizar sólo 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
A continuación, puede subconjunto que:
> a[names(a)==435]
435
3
O convertirlo en un hoja.de.datos si se siente más cómodo trabajando con lo siguiente:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
Otros consejos
La forma más directa es sum(numbers == x)
.
numbers == x
crea un vector lógico que es TRUE en todos los puntos que se produce x, y cuando sum
ing, el vector lógico es coaccionado a numérico que convierte TRUE a 1 y FALSE a 0.
Sin embargo, cabe destacar que para los números de punto flotante que es mejor usar algo como:. sum(abs(numbers - x) < 1e-6)
Yo probablemente hacer algo como esto
length(which(numbers==x))
Pero, en realidad, de una mejor manera es
table(numbers)
También hay count(numbers)
del paquete plyr
. Mucho más conveniente que table
en mi opinión.
Mi solución preferida utiliza rle
, que devolverá un valor (la etiqueta, x
en su ejemplo) y una longitud, que representa el número de veces que el valor apareció en secuencia.
Al combinar rle
con sort
, tiene una forma extremadamente rápida para contar el número de veces que apareció ningún valor. Esto puede ser útil con los problemas más complejos.
Ejemplo:
> numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
> a <- rle(sort(numbers))
> a
Run Length Encoding
lengths: int [1:15] 2 1 2 2 1 1 2 1 2 1 ...
values : num [1:15] 4 5 23 34 43 54 56 65 67 324 ...
Si el valor que desea no aparece, o si necesita almacenar ese valor para después, hacer un a
data.frame
.
> b <- data.frame(number=a$values, n=a$lengths)
> b
values n
1 4 2
2 5 1
3 23 2
4 34 2
5 43 1
6 54 1
7 56 2
8 65 1
9 67 2
10 324 1
11 435 3
12 453 1
13 456 1
14 567 1
15 657 1
Me parece que es raro que yo quiero saber la frecuencia de un valor y no todos los valores, y RLE parece ser la forma más rápida de contar y almacenar todos ellos.
Hay una función estándar en R para que
tabulate(numbers)
He aquí una manera rápida y sucia:
x <- 23
length(subset(numbers, numbers==x))
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435 453,435,324,34,456,56,567,65,34,435)
> length(grep(435, numbers))
[1] 3
> length(which(435 == numbers))
[1] 3
> require(plyr)
> df = count(numbers)
> df[df$x == 435, ]
x freq
11 435 3
> sum(435 == numbers)
[1] 3
> sum(grepl(435, numbers))
[1] 3
> sum(435 == numbers)
[1] 3
> tabulate(numbers)[435]
[1] 3
> table(numbers)['435']
435
3
> length(subset(numbers, numbers=='435'))
[1] 3
Si desea contar el número de apariciones posteriormente, se puede hacer uso de la función sapply
:
index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)
Salida:
numbers index
[1,] 4 1
[2,] 23 1
[3,] 4 2
[4,] 23 2
[5,] 5 1
[6,] 43 1
[7,] 54 1
[8,] 56 1
[9,] 657 1
[10,] 67 1
[11,] 67 2
[12,] 435 1
[13,] 453 1
[14,] 435 2
[15,] 324 1
[16,] 34 1
[17,] 456 1
[18,] 56 2
[19,] 567 1
[20,] 65 1
[21,] 34 2
[22,] 435 3
Puede cambiar el número a lo que usted desea en el seguimiento de la línea
length(which(numbers == 4))
El uso de mesa, pero sin comparar con names
:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435)
x <- 67
numbertable <- table(numbers)
numbertable[as.character(x)]
#67
# 2
table
es útil cuando se utiliza el recuento de elementos diferentes en varias ocasiones. Si sólo necesita un cargo, el uso sum(numbers == x)
Una forma más encuentro conveniente es:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
(s<-summary (as.factor(numbers)))
Esto convierte el conjunto de datos de factor, y luego resumen () nos da los totales de control (recuentos de los valores únicos).
La salida es:
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
Esto puede ser almacenada como trama de datos si se prefiere.
as.data.frame (cbind (Number = nombres (s), Freq = s), stringsAsFactors = F, row.names = 1: longitud (s))
A continuación row.names se ha utilizado para cambiar el nombre de los nombres de fila. sin utilizar row.names, nombres de columna de s se utilizan como nombres de las filas en la nueva trama de datos
La salida es:
Number Freq
1 4 2
2 5 1
3 23 2
4 34 2
5 43 1
6 54 1
7 56 2
8 65 1
9 67 2
10 324 1
11 435 3
12 453 1
13 456 1
14 567 1
15 657 1
Existen diferentes maneras de contar una serie de elementos específicos
library(plyr)
numbers =c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,7,65,34,435)
print(length(which(numbers==435)))
#Sum counts number of TRUE's in a vector
print(sum(numbers==435))
print(sum(c(TRUE, FALSE, TRUE)))
#count is present in plyr library
#o/p of count is a DataFrame, freq is 1 of the columns of data frame
print(count(numbers[numbers==435]))
print(count(numbers[numbers==435])[['freq']])
Esto se puede hacer con outer
para obtener una metrix de igualdades seguido de rowSums
, con un significado obvio.
Con el fin de tener los recuentos y numbers
en el mismo conjunto de datos, se crea por primera vez un hoja.de.datos. Este paso no es necesario si se quiere de entrada y salida independiente.
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))