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 fazer R contar o número de vezes que um valor x aparece no vetor?
Você pode apenas usar 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 configurá-lo:
> a[names(a)==435]
435
3
Ou converta-o em data.frame se você estiver mais confortável trabalhando com isso:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
a["435"]
insinuara[names(a)==435]
?A maneira mais direta é
sum(numbers == x)
.numbers == x
cria um vetor lógico que é VERDADEIRO em todos os locais em que x ocorre e quandosum
ing, o vetor lógico é coagido para numérico que converte TRUE em 1 e FALSE em 0.No entanto, nota que, para números de ponto flutuante é melhor usar algo como:
sum(abs(numbers - x) < 1e-6)
.fonte
x
os dados, em vez de um valor conhecido específico dex
. Para ser justo, era disso que se tratava a pergunta original. Como eu disse em minha resposta abaixo, "Acho que é raro que eu quero saber a frequência de um valor e não todos os valores ..."Eu provavelmente faria algo assim
Mas realmente, uma maneira melhor é
fonte
table(numbers)
vai fazer muito mais trabalho do que a solução mais fácilsum(numbers==x)
, porque também vai descobrir as contagens de todos os outros números da lista.Há também
count(numbers)
doplyr
pacote. Muito mais conveniente do quetable
na minha opinião.fonte
Minha solução preferida usa
rle
, que retornará um valor (o rótulo,x
no seu exemplo) e um comprimento, que representa quantas vezes esse valor apareceu em sequência.Combinando
rle
comsort
, você tem uma maneira extremamente rápida de contar o número de vezes que qualquer valor apareceu. Isso pode ser útil com problemas mais complexos.Exemplo:
Se o valor que você deseja não aparecer, ou você precisar armazená-lo para mais tarde, faça
a
adata.frame
.Acho raro querer saber a frequência de um valor e não todos, e rle parece ser a maneira mais rápida de contar e armazenar todos.
fonte
c(rep('A', 3), rep('G', 4), 'A', rep('G', 2), rep('C', 10))
retornariavalues = c('A','G','A','G','C')
elengths=c(3, 4, 1, 2, 10)
que às vezes é útil.table
é mais rápidowhen the vector is long
(eu tentei 100000), mas ligeiramente mais longo quando mais curto (Tentei 1000)Existe uma função padrão em R para esse
tabulate(numbers)
fonte
tabulate
é que você não pode lidar com números zero e negativos.tabulate
. Nota:sort
parece ser necessário para o seu uso correto em geral:tabulate(sort(numbers))
.fonte
aqui está uma maneira rápida e suja:
fonte
Se você quiser contar o número de aparências posteriormente, poderá usar a
sapply
função:Resultado:
fonte
Você pode alterar o número para o que desejar na linha a seguir
fonte
Mais uma maneira que eu acho conveniente é:
Isso converte o conjunto de dados em fator e, em seguida, o resumo () fornece os totais de controle (contagens dos valores exclusivos).
A saída é:
Isso pode ser armazenado como dataframe, se preferir.
aqui row.names foi usado para renomear nomes de linhas. sem usar row.names, os nomes de coluna em s são usados como nomes de linha no novo dataframe
A saída é:
fonte
Usando tabela, mas sem comparar com
names
:table
é útil quando você estiver usando as contagens de diferentes elementos várias vezes. Se você precisar de apenas uma contagem, usesum(numbers == x)
fonte
Existem diferentes maneiras de contar elementos específicos
fonte
Um método que é relativamente rápido em vetores longos e fornece uma saída conveniente é usar
lengths(split(numbers, numbers))
(observe o S no final delengths
):A saída é simplesmente um vetor nomeado.
A velocidade parece comparável à
rle
proposta pelo JBecker e até um pouco mais rápida em vetores muito longos. Aqui está uma marca de microbench no R 3.6.2 com algumas das funções propostas:Importante, a única função que também conta o número de valores ausentes
NA
éplyr::count
. Estes também podem ser obtidos separadamente usandosum(is.na(vec))
fonte
Esta é uma solução muito rápida para vetores atômicos unidimensionais. Ele conta com
match()
, portanto, é compatível comNA
:Você também pode ajustar o algoritmo para que ele não seja executado
unique()
.Nos casos em que essa saída é desejável, você provavelmente nem precisa retornar o vetor original e a segunda coluna é provavelmente tudo o que você precisa. Você pode colocar isso em uma linha com o pipe:
fonte
Isso pode ser feito
outer
para obter uma metrix de igualdades seguida porrowSums
, com um significado óbvio.Para ter as contagens e
numbers
no mesmo conjunto de dados, um data.frame é criado primeiro. Esta etapa não é necessária se você desejar entrada e saída separadas.fonte