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