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ę zliczyć R, ile razy wartość x pojawia się w wektorze?
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
Następnie możesz go podzielić:
> a[names(a)==435]
435
3
Lub przekonwertuj go na ramkę danych, jeśli wygodniej z tym pracujesz:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
a["435"]
insetead oda[names(a)==435]
?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 podczassum
ing wektor logiczny jest wymuszany na numeryczny, który konwertuje PRAWDA na 1, a FAŁSZ na 0.Jednak należy pamiętać, że dla liczb zmiennoprzecinkowych to lepiej użyć czegoś takiego:
sum(abs(numbers - x) < 1e-6)
.źródło
x
dane, a nie na określoną znaną wartośćx
. Szczerze mówiąc, o to właśnie chodziło w pierwotnym pytaniu. Jak powiedziałem w odpowiedzi poniżej, „rzadko zdarza mi się znać częstotliwość jednej wartości, a nie wszystkich wartości ...”Prawdopodobnie zrobiłbym coś takiego
Ale tak naprawdę jest lepszy sposób
źródło
table(numbers)
wykona znacznie więcej pracy niż najłatwiejsze rozwiązanie,sum(numbers==x)
ponieważ obliczy również liczbę wszystkich pozostałych liczb na liście.Jest też
count(numbers)
zplyr
paczki. O wiele wygodniejszy niżtable
w mojej opinii.źródło
Moje preferowane rozwiązanie używa
rle
, które zwróci wartość (etykietęx
w twoim przykładzie) i długość, która reprezentuje ile razy ta wartość pojawiła się w sekwencji.Łącząc się
rle
zsort
, masz niezwykle szybki sposób na policzenie liczby wyświetleń dowolnej wartości. Może to być pomocne w przypadku bardziej złożonych problemów.Przykład:
Jeśli wartość chcesz nie pokazuje się, czy trzeba przechowywać tę wartość na później, należy .
a
data.frame
Uważam, że rzadko zdarza się, że chcę znać częstotliwość jednej wartości, a nie wszystkich wartości, a rle wydaje się być najszybszym sposobem na zliczenie i zapamiętanie ich wszystkich.
źródło
c(rep('A', 3), rep('G', 4), 'A', rep('G', 2), rep('C', 10))
wróciłbyvalues = c('A','G','A','G','C')
ilengths=c(3, 4, 1, 2, 10)
co czasami jest przydatne.table
jest szybszywhen the vector is long
(próbowałem 100000), ale nieco dłużej, gdy jest krótszy (próbowałem 1000)W tym celu istnieje standardowa funkcja w języku R.
tabulate(numbers)
źródło
tabulate
jest to, że nie radzisz sobie z liczbami zerowymi i ujemnymi.tabulate
. Uwaga:sort
wydaje się być konieczne dla właściwego stosowania w ogóle:tabulate(sort(numbers))
.źródło
oto jeden szybki i brudny sposób:
źródło
Jeśli chcesz później policzyć liczbę wystąpień, możesz skorzystać z
sapply
funkcji:Wynik:
źródło
Możesz zmienić numer na cokolwiek zechcesz w następnym wierszu
źródło
Jeszcze jeden sposób, który uważam za wygodny, to:
Konwertuje to zestaw danych na współczynnik, a następnie podsumowanie () daje nam sumy kontrolne (liczby unikatowych wartości).
Dane wyjściowe to:
W razie potrzeby można to zapisać jako ramkę danych.
tutaj row.names służy do zmiany nazw nazw wierszy. bez użycia row.names, nazwy kolumn ws są używane jako nazwy wierszy w nowej ramce danych
Dane wyjściowe to:
źródło
Używanie tabeli, ale bez porównywania z
names
:table
jest przydatny, gdy kilka razy korzystasz z liczników różnych elementów. Jeśli potrzebujesz tylko jednej liczby, użyjsum(numbers == x)
źródło
Istnieją różne sposoby liczenia określonych elementów
źródło
Metodą, która jest stosunkowo szybka na długich wektorach i daje wygodne wyjście, jest użycie
lengths(split(numbers, numbers))
(zwróć uwagę na S na końculengths
):Wynik jest po prostu nazwanym wektorem.
Szybkość wydaje się porównywalna do
rle
proponowanej przez JBeckera, a nawet nieco większa w przypadku bardzo długich wektorów. Oto znak firmowy w R 3.6.2 z niektórymi proponowanymi funkcjami:Co ważne, jedyną funkcją, która również liczy liczbę brakujących wartości,
NA
jestplyr::count
. Można je również uzyskać osobno za pomocąsum(is.na(vec))
źródło
To bardzo szybkie rozwiązanie dla jednowymiarowych wektorów atomowych. To zależy
match()
, więc jest kompatybilny zNA
:Możesz również dostosować algorytm, aby nie działał
unique()
.W przypadkach, w których pożądane jest wyjście, prawdopodobnie nawet nie potrzebujesz go, aby przywrócić oryginalny wektor, a druga kolumna to prawdopodobnie wszystko, czego potrzebujesz. Możesz uzyskać to w jednej linii za pomocą fajki:
źródło
Można tego dokonać,
outer
aby uzyskać metrykę równościrowSums
, która ma oczywiste znaczenie.Aby mieć liczby i
numbers
ten sam zestaw danych, najpierw tworzona jest ramka danych. Ten krok nie jest potrzebny, jeśli chcesz osobne wejście i wyjście.źródło