Liczenie liczby elementów o wartościach x w wektorze

Mam wektor liczb:

numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
         453,435,324,34,456,56,567,65,34,435)

Jak mogę policzyć liczbę razy wartość x pojawia się w wektorze?

Author: epo3, 2009-12-17

12 answers

Możesz po prostu użyć 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 

Wtedy możesz go podzestawić:

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

Lub przekształcić je w dane.ramka, jeśli jest ci wygodniej pracować z tym:

> as.data.frame(table(numbers))
   numbers Freq
1        4    2
2        5    1
3       23    2
4       34    2
...
 405
Author: Shane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 17:32:19

Najbardziej bezpośredni sposób to sum(numbers == x).

numbers == x tworzy wektor logiczny, który jest prawdziwy w każdym miejscu, w którym występuje x, A gdy sum ing, wektor logiczny jest wymuszony na liczbowy, który przekształca TRUE na 1 i FALSE na 0.

Należy jednak pamiętać, że dla liczb zmiennoprzecinkowych lepiej jest użyć czegoś w rodzaju: sum(abs(numbers - x) < 1e-6).

 217
Author: hadley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 18:09:42

Prawdopodobnie zrobiłbym coś takiego

length(which(numbers==x))

Ale tak naprawdę, lepszym sposobem jest

table(numbers)
 47
Author: Jesse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 17:55:16

Istnieje również count(numbers) z plyr pakietu. O wiele wygodniejsze niż table moim zdaniem.

 32
Author: geotheory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-24 14:58:46

Moje preferowane rozwiązanie używa rle, która zwróci wartość (Etykieta, x w twoim przykładzie) i długość, która reprezentuje ile razy ta wartość pojawiała się w kolejności.

Łącząc rle z sort, masz niezwykle szybki sposób policzenia liczby wyświetlanych wartości. Może to być pomocne w przypadku bardziej złożonych problemów.

Przykład:

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

Jeśli żądana wartość nie pojawi się lub musisz ją zapisać na później, Utwórz a 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

Uważam, że to rzadkie, że chcę znać częstotliwość jednej wartości, a nie wszystkich wartości, a rle wydaje się być najszybszym sposobem, aby policzyć i zapisać je wszystkie.

 31
Author: JBecker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-13 21:43:28

Istnieje standardowa funkcja W R dla tego

tabulate(numbers)

 16
Author: Sergej Andrejev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-19 13:13:15

Oto jeden szybki i brudny sposób:

x <- 23
length(subset(numbers, numbers==x))
 8
Author: JD Long,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 17:27:54

Jeśli chcesz następnie policzyć ilość wystąpień, możesz skorzystać z funkcji sapply:

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

Wyjście:

        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
 8
Author: Berny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 12:35:40

Możesz zmienić liczbę na dowolną w poniższej linii

length(which(numbers == 4))
 6
Author: uttkarsh dharmadhikari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-19 04:31:34
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
 5
Author: ishandutta2007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-07 13:22:04

Jeszcze jeden sposób, który uważam za Wygodny, to:

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

To konwertuje zbiór danych na czynnik, a następnie summary() dają nam sumy kontrolne (zliczenia unikalnych wartości).

Wyjście To:

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 

Może być przechowywany jako ramka danych, jeśli jest to preferowane.

As.data.frame (Cbind(Number = names (s),Freq = s), stringsAsFactors=F, row.names = 1: length(S))

Tutaj rząd.nazwa została użyta do zmiany nazw wierszy. bez użycia wiersza.nazwy, nazwy kolumn w s są używane jako nazwy wierszy w nowym dataframe

Wyjście To:

     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
 2
Author: Akash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-26 07:11:31

Używając tabeli, ale bez porównania z 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 jest przydatny, gdy używasz liczników różnych elementów kilka razy. Jeśli potrzebujesz tylko jednej liczby, użyj sum(numbers == x)

 2
Author: pomber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-26 17:18:14