Contare il numero di elementi con i valori di x in un vettore
Domanda
Ho un vettore di numeri:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
453,435,324,34,456,56,567,65,34,435)
Come posso avere il conteggio R il numero di volte che un valore di x appare nel vettore?
Soluzione
Si può semplicemente utilizzare 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
Poi si può sottoinsieme che:
> a[names(a)==435]
435
3
O convertirlo in un data.frame se siete più comodo lavorare con che:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
Altri suggerimenti
Il modo più diretto è sum(numbers == x)
.
numbers == x
crea un vettore logico che è TRUE qualunque posizione in cui x si verifica, e quando sum
ing, il vettore logico è costretto a numerico che converte TRUE a 1 e FALSE a 0.
Si noti tuttavia che per i numeri in virgola mobile è meglio usare qualcosa come:. sum(abs(numbers - x) < 1e-6)
Vorrei probabilmente fare qualcosa di simile
length(which(numbers==x))
Ma in realtà, un modo migliore è
table(numbers)
C'è anche count(numbers)
dalla confezione plyr
. Molto più conveniente che table
a mio parere.
La mia soluzione preferita utilizza rle
, che restituirà un valore (l'etichetta, x
nel tuo esempio) ed una lunghezza, che rappresenta il numero di volte che il valore è apparso in sequenza.
Grazie alla combinazione di rle
con sort
, si dispone di un modo estremamente veloce per contare il numero di volte in cui è apparso alcun valore. Questo può essere utile con problemi più complessi.
Esempio:
> 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 il valore desiderato non viene visualizzato, o avete bisogno di memorizzare tale valore per dopo, fare 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
Trovo è raro che io voglio sapere la frequenza di un valore e non tutti i valori, e rle sembra essere il modo più rapido per ottenere contare e memorizzare tutti loro.
V'è una funzione standard in R per quella
tabulate(numbers)
Ecco un modo veloce e sporco:
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 si desidera contare il numero di presenze in seguito, è possibile utilizzare la funzione di sapply
:
index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)
Output:
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
È possibile modificare il numero di quello che vuoi nella seguente riga
length(which(numbers == 4))
Utilizzando tavolo, ma senza il confronto 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
è utile quando si utilizzano i conti di diversi elementi più volte. Se è necessario solo un conteggio, l'uso sum(numbers == x)
Un modo più trovo 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)))
Questo trasforma il set di dati di fattore, e poi riassunto () ci dà i totali di controllo (conta dei valori unici).
L'uscita è:
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
Questo può essere memorizzato come dataframe se si preferisce.
as.data.frame (cbind (Number = nomi (s), Freq = s), stringsAsFactors = F, row.names = 1: lunghezza (s))
qui row.names è stato utilizzato per rinominare i nomi delle righe. senza utilizzare row.names, nomi delle colonne s vengono utilizzate come nomi di riga nella nuova dataframe
L'uscita è:
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
Ci sono diversi modi di contare una specifica gli elementi
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']])
Questo può essere fatto con outer
per ottenere una Metrix di uguaglianze seguita da rowSums
, con un significato evidente.
Al fine di avere i conti e numbers
nello stesso set di dati, viene creato un data.frame. Questo passo non è necessario se si vuole input e l'output separati.
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))