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?

¿Fue útil?

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 suming, 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 = `==`))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top