vacio - Contando el número de elementos con los valores de x en un vector
llenar un vector en matlab (12)
Aquí hay una manera rápida y sucia:
x <- 23
length(subset(numbers, numbers==x))
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?
Hay una función estándar en R para eso
tabulate(numbers)
La forma más directa es la sum(numbers == x)
.
numbers == x
crea un vector lógico que es VERDADERO en cada ubicación en la que ocurre x, y al sum
, el vector lógico se convierte en numérico, lo que convierte a VERDADERO en 1 y FALSO en 0.
Sin embargo, tenga en cuenta que para los números de punto flotante es mejor usar algo como: sum(abs(numbers - x) < 1e-6)
.
Mi solución preferida utiliza rle
, que devolverá un valor (la etiqueta, x
en su ejemplo) y una longitud, que representa cuántas veces apareció ese valor en secuencia.
Al combinar rle
con sort
, tiene una forma extremadamente rápida de contar el número de veces que apareció un valor. Esto puede ser útil con 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 más adelante, data.frame
un 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
Encuentro que es raro que quiera saber la frecuencia de un valor y no todos los valores, y parece ser la forma más rápida de contar y almacenarlos todos.
Probablemente haría algo como esto
length(which(numbers==x))
Pero en realidad, una mejor manera es
table(numbers)
Puede cambiar el número a lo que desee en la siguiente línea
length(which(numbers == 4))
Puedes usar la 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 subordinarlo:
> a[names(a)==435]
435
3
O conviértalo en un data.frame si está 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
...
Si desea contar el número de apariciones posteriormente, puede utilizar la función de 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
También hay count(numbers)
del paquete plyr
. Mucho más conveniente que la table
en mi opinión.
Una forma más que 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 a factor, y luego el resumen () nos da los totales de control (conteos 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 se puede almacenar como marco de datos si se prefiere.
as.data.frame (cbind (Number = names (s), Freq = s), stringsAsFactors = F, row.names = 1: length (s))
aquí row.names se ha utilizado para cambiar el nombre de las filas. sin usar nombres de fila, los nombres de columna en s se usan como nombres de fila en el nuevo marco 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
Usando tabla 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 estás utilizando los conteos de diferentes elementos varias veces. Si solo necesita una cuenta, use la sum(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