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?

Odpowiedzi:



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.


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)


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

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)

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)


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.