Contando o número de elementos com os valores de x em um vetor
Pergunta
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 com que R conte o número de vezes que um valor x aparece no vetor?
Solução
Você pode simplesmente 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 subcisionar:
> a[names(a)==435]
435
3
Ou convertê -lo em dados.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
...
Outras dicas
A maneira mais direta é sum(numbers == x)
.
numbers == x
cria um vetor lógico que é verdadeiro em todos os locais que X ocorre e quando sum
Ing, o vetor lógico é coagido a numérico, que converte true em 1 e falso em 0.
No entanto, observe 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)
Há também count(numbers)
a partir de plyr
pacote. Muito mais conveniente do que table
Na minha opinião.
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
com sort
, 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:
> 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ê precisa armazenar esse valor posterior, faça a
uma 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
Acho raro que eu queira saber a frequência de um valor e não todos os valores, e RLE parece ser a maneira mais rápida de obter a contagem e armazená -los todos.
Existe uma função padrão em r para isso
tabulate(numbers)
Aqui está uma maneira rápida e suja:
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
Se você quiser contar o número de aparências posteriormente, pode usar o sapply
função:
index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)
Resultado:
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 desejar na linha seguinte
length(which(numbers == 4))
Usando a 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 apenas de uma contagem, use sum(numbers == x)
Mais uma maneira que considero 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 conjunto de dados em fator e, em seguida, summary() nos fornece os totais de controle (contagens dos valores únicos).
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 = nomes(s),Freq = s), stringsAsFactors=F, row.names = 1:comprimento(s))
aqui row.names foi usado para renomear nomes de linhas.sem usar row.names, os nomes das colunas em s são usados como nomes de linhas 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
Existem diferentes maneiras de contar um 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']])
Isso pode ser feito com outer
para obter uma metrice de igualdade seguida por rowSums
, com um significado óbvio.
Para ter as contagens e numbers
No mesmo conjunto de dados, um data.frame é criado pela primeira vez. Esta etapa não é necessária se você deseja entrada e saída separadas.
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))