Próbuję się nauczyć R i nie mogę dowiedzieć się, jak dołączyć do listy.
Gdyby to był Python, zrobiłbym to. . .
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
Jak to robisz w R?
#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector
vector = values
; lub możesz zrobić wektor = wektor + wartości. Ale mogę źle zrozumieć twój przypadek użyciaOdpowiedzi:
Dołączanie do obiektu w pętli for powoduje, że cały obiekt jest kopiowany w każdej iteracji, co powoduje, że wiele osób mówi „R jest wolne” lub „R pętli należy unikać”.
Jak BrodieG wspomniał w komentarzach: znacznie lepiej jest wstępnie alokować wektor o żądanej długości, a następnie ustawić wartości elementów w pętli.
Oto kilka sposobów dołączania wartości do wektora. Wszyscy są zniechęceni.
Dołączanie do wektora w pętli
help("append")
odpowiedziałby na twoje pytanie i zaoszczędziłby czas, jaki zajął ci napisanie tego pytania (ale spowodowałby, że rozwinąłbyś złe nawyki). ;-)Zauważ, że
vector <- c()
nie jest to pusty wektor; to jestNULL
. Jeśli chcesz mieć pusty wektor znaków, użyjvector <- character()
.Wstępnie przydziel wektor przed zapętleniem
Jeśli absolutnie musisz użyć pętli for, powinieneś wstępnie przydzielić cały wektor przed pętlą. Będzie to znacznie szybsze niż dołączanie do większych wektorów.
źródło
vector <- character(length(values)); for(...
)?FWIW: analogiczne do append () w pythonie:
źródło
b <- 1; b <- append(b, 2)
. Ale jak wspomniałeś, c () jest bardziej R sposobem robienia rzeczy.Masz kilka możliwości:
c(vector, values)
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
Pierwsza z nich to podejście standardowe. Drugi daje możliwość dodania innego miejsca niż koniec. Ten ostatni jest nieco wykrzywiony, ale ma tę zaletę, że modyfikuje
vector
(choć tak naprawdę można to równie łatwo zrobićvector <- c(vector, values)
.Zauważ, że w R nie musisz przełączać wektorów. Możesz po prostu operować nimi w całości.
Jest to również dość podstawowa sprawa, więc powinieneś przejrzeć niektóre z odniesień .
Kilka dodatkowych opcji w oparciu o opinie OP:
źródło
c
do dołączania dataframe zamiast wektorów?Tylko ze względu na kompletność, dołączanie wartości do wektora w pętli for nie jest tak naprawdę filozofią w R. R działa lepiej, działając na wektorach jako całości, jak zauważył @BrodieG. Sprawdź, czy Twojego kodu nie można przepisać jako:
Wyjście będzie wektorem zwracanych wartości. Możesz także użyć,
lapply
jeśli wartości są listą zamiast wektorem.źródło
Czasami musimy użyć pętli, na przykład, gdy nie wiemy, ile iteracji potrzebujemy, aby uzyskać wynik. Weźmy na przykład pętle while. Poniżej znajdują się metody, których absolutnie powinieneś unikać:
Są one bardzo nieefektywne, ponieważ R kopiuje wektor za każdym razem, gdy jest dołączany.
Najbardziej wydajnym sposobem dołączania jest użycie indeksu. Zauważ, że tym razem pozwoliłem iterować 1e7 razy, ale nadal jest znacznie szybszy niż
c
.To jest do zaakceptowania. I możemy zrobić to nieco szybciej, zastępując
[
z[[
.Może już zauważyłeś, że
length
może to być czasochłonne. Jeśli zastąpimylength
licznikiem:Jak wspominali inni użytkownicy, wstępne przydzielenie wektora jest bardzo pomocne. Ale jest to kompromis między szybkością a zużyciem pamięci, jeśli nie wiesz, ile pętli potrzebujesz, aby uzyskać wynik.
Metoda pośrednia polega na stopniowym dodawaniu bloków wyników.
źródło
W R możesz wypróbować w ten sposób:
źródło
źródło
To, czego używasz w kodzie Pythona, nazywa się listą w Pythonie i różni się całkowicie od wektorów R, jeśli dostanę to, co chcesz zrobić:
źródło