Contando o número de elementos com os valores de x em um vetor

Eu tenho um vetor 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) 

Como posso ter R contando o número de vezes que um valor x aparece no vetor?

   

    Você pode apenas usar a 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 

    Então você pode subdividir:

     > a[names(a)==435] 435 3 

    Ou converta-o em data.frame se estiver mais à vontade para trabalhar com isso:

     > as.data.frame(table(numbers)) numbers Freq 1 4 2 2 5 1 3 23 2 4 34 2 ... 

    A maneira mais direta é sum(numbers == x) .

    numbers == x cria um vetor lógico que é VERDADEIRO em cada localização que x ocorre e, quando sum , o vetor lógico é coagido para numérico que converte VERDADEIRO em 1 e FALSO em 0.

    No entanto, note que para números de ponto flutuante é melhor usar algo como: sum(abs(numbers - x) < 1e-6) .

    Eu provavelmente faria algo assim

     length(which(numbers==x)) 

    Mas realmente, uma maneira melhor é

     table(numbers) 

    Também há count(numbers) do pacote plyr . Muito mais conveniente do que table na minha opinião.

    Minha solução preferida usa rle , que retornará um valor (o label, x em seu exemplo) e um comprimento, que representa quantas vezes esse valor apareceu em sequência.

    Ao combinar rle com sort , você tem uma maneira extremamente rápida de contar o número de vezes que qualquer valor apareceu. Isso pode ser útil em problemas mais complexos.

    Exemplo:

     > 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 ... 

    Se o valor que você deseja não aparecer, ou você precisar armazenar esse valor para mais tarde, crie um 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 

    Eu acho raro que eu queira saber a frequência de um valor e não todos os valores, e o rle parece ser a maneira mais rápida de obter contagem e armazená-los todos.

    Existe uma function padrão em R para isso

    tabulate(numbers)

    aqui está uma maneira rápida e suja:

     x < - 23 length(subset(numbers, numbers==x)) 

    Se você quiser contar o número de aparições subseqüentemente, você pode fazer uso da function sapply :

     index< -sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x])) cbind(numbers, index) 

    Saída:

      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 

    Você pode alterar o número para o que você deseja na linha seguinte

     length(which(numbers == 4)) 
     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 

    Mais uma maneira que eu acho conveniente é:

     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))) 

    Isso converte o dataset em fator e, em seguida, o resumo () nos fornece os totais de controle (contagens dos valores exclusivos).

    A saída é:

     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 

    Isso pode ser armazenado como dataframe, se preferir.

    as.data.frame (cbind (Número = nome (s), Freq = s), stringsAsFactors = F, linha.nomes = 1: comprimento (s))

    aqui row.names foi usado para renomear nomes de linha. sem usar row.names, os nomes das colunas em s são usados ​​como nomes de linha no novo dataframe

    A saída é:

      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 tabela, mas sem comparar com 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 é útil quando você está usando as contagens de diferentes elementos várias vezes. Se você precisar de apenas uma contagem, use sum(numbers == x)