Jak stworzyć pusty wektor R, aby dodać nowe elementy

93

Chcę używać języka R w Pythonie, jak zapewnia moduł Rpy2. Zauważyłem, że R ma bardzo wygodne []operacje, za pomocą których można wyodrębnić określone kolumny lub wiersze. Jak mogłem osiągnąć taką funkcję przez skrypty Pythona?

Moim pomysłem jest stworzenie wektora R i dodanie tych poszukiwanych elementów do tego wektora, tak aby końcowy wektor był taki sam jak w R. Stworzyłem a seq(), ale wydaje się, że ma początkową cyfrę 1, więc końcowy wynik zawsze zacznij od cyfry 1, co nie jest tym, czego chcę. Czy jest więc lepszy sposób na zrobienie tego?

ligwin
źródło

Odpowiedzi:

95
vec <- vector()

Zobacz także pomoc wektorową

?vector
Brani
źródło
56

Wstępnie przydzielam wektor za pomocą

> (a <- rep(NA, 10))
 [1] NA NA NA NA NA NA NA NA NA NA

Następnie możesz użyć [], aby wstawić do niego wartości.

Roman Luštrik
źródło
To najlepsza odpowiedź, jeśli długość wektora jest znana od samego początku, ponieważ będzie on najbardziej wydajny w pamięci
stevec
25

Możesz stworzyć taki pusty wektor

vec <- numeric(0)

A następnie dodaj elementy za pomocą c ()

vec <- c(vec, 1:5)

Jednak, jak mówi Romunov, znacznie lepiej jest wstępnie przydzielić wektor, a następnie go wypełnić (ponieważ pozwala to uniknąć ponownego przydzielania nowej kopii wektora za każdym razem, gdy dodajesz elementy)

Aaron Statham
źródło
Podoba mi się twoje rozwiązanie z numeric (), ale moje doświadczenie skłoniło mnie do używania NA zamiast 0 (jeśli użyjesz numeric (2), otrzymasz 0 0). Ale to moje osobiste preferencje.
Roman Luštrik,
Wielkie dzięki!! Ale czy można zwolnić poprzedni po dodaniu jednego nowego elementu? czy powinienem po prostu użyć rm ()?
ligwin
Jest jeszcze jeden problem, że typeof (numeric (0)) daje "double", podczas gdy poszukiwane elementy dają "integer", po dodaniu wystąpił błąd mówiąc: "Typ nowej wartości nie może być inny", jak przekonwertować?
ligwin
podczas pracy w pythonie słowo „as” jest słowem kluczowym, dodatkowo python nie ma takich typów danych, więc myślę, że „as.integer” nie zadziała?
ligwin
romunov - numeryczny (0) oznacza utworzenie wektora numerycznego o długości 0 (tj. bez elementów), a nie wektora o długości 1 z tym elementem równym 0
Aaron Statham
7

Aby stworzyć pusty wektor użyj:

vec <- c();

Proszę zauważyć, że nie zakładam żadnych założeń co do typu wymaganego wektora, np. Numeryczny.

Po utworzeniu wektora możesz dodać do niego elementy w następujący sposób:

Na przykład, aby dodać wartość liczbową 1:

vec <- c(vec, 1);

lub, aby dodać wartość ciągu „a”

vec <- c(vec, "a");
Eldaw
źródło
4
Czy faktycznie próbowałeś tego? vec <- c()ustawia vec na NULL. Jeśli chcesz pusty wektor należałoby użyć vec <- character(), vec <- numeric()itd.
Matthew Wise
5

Ja też widziałem

x <- {}

Teraz możesz połączyć lub powiązać wektor o dowolnym wymiarze x

rbind(x, 1:10)
cbind(x, 1:10)
c(x, 10)
JoFrhwld
źródło
2
To jest dokładnie to samo x <- NULLi nie tworzy niczego innego niż odniesienie do niczego.
Joris Meys,
3

Jak zauważył Brani, rozwiązaniem vector () jest np

newVector <- vector(mode = "numeric", length = 50)

zwróci wektor o nazwie „newVector” z 50 „0” jako wartościami początkowymi. Dość często po prostu dodaje się nowy skalar do istniejącego wektora, aby uzyskać rozszerzony wektor, np

aVector <- c(aVector, newScalar)

Sam
źródło
2

W rpy2 sposobem na uzyskanie tego samego operatora co "[" w R jest użycie ".rx". Zobacz dokumentację dotyczącą wypakowywania za pomocą rpy2

W przypadku tworzenia wektorów, jeśli znasz się na Pythonie, nie powinno być żadnych problemów. Zobacz dokumentację dotyczącą tworzenia wektorów

lgautier
źródło
Kiedyś tworzyłem w tym celu funkcję w Pythonie, która jest bardzo skomplikowana i nie jestem pewien, jak szeroko mogłaby ona mieć zastosowanie. Teraz myślę, że z tymi operatorami życie mogłoby być znacznie łatwiejsze :)
ligwin