vectores vacio llenar extraer eliminar elementos datos crear comandos almacenar agregar r vector count r-faq

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