Cara membuat vektor R kosong untuk menambahkan item baru


93

Saya ingin menggunakan R dengan Python, seperti yang disediakan oleh modul Rpy2. Saya perhatikan bahwa R memiliki []operasi yang sangat mudah dimana Anda dapat mengekstrak kolom atau garis tertentu. Bagaimana saya bisa mencapai fungsi seperti itu dengan skrip Python?

Ide saya adalah membuat vektor R dan menambahkan elemen yang diinginkan ke dalam vektor ini sehingga vektor akhirnya sama dengan yang ada di R. Saya membuat a seq(), tetapi tampaknya ia memiliki angka awal 1, jadi hasil akhirnya akan selalu mulai dengan angka 1, yang bukan yang saya inginkan. Jadi, adakah cara yang lebih baik untuk melakukan ini?

Jawaban:


95
vec <- vector()

Lihat juga bantuan vektor

?vector

56

Saya mengalokasikan sebelumnya vektor dengan

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

Anda kemudian dapat menggunakan [] untuk memasukkan nilai ke dalamnya.


Ini adalah jawaban terbaik jika panjang vektor diketahui sejak awal, karena akan paling efisien dalam memori
stevec

25

Anda dapat membuat vektor kosong seperti itu

vec <- numeric(0)

Dan kemudian tambahkan elemen menggunakan c ()

vec <- c(vec, 1:5)

Namun seperti yang dikatakan romunov, jauh lebih baik untuk mengalokasikan vektor terlebih dahulu dan kemudian mengisinya (karena ini menghindari realokasi salinan baru dari vektor Anda setiap kali Anda menambahkan elemen)


Saya suka solusi Anda dengan numerik (), tetapi pengalaman saya telah membuat saya menggunakan NA, bukan 0 (jika Anda menggunakan numerik (2), Anda akan mendapatkan 0 0). Tapi itu preferensi pribadi saya.
Roman Luštrik

Terimakasih banyak!! Tetapi apakah mungkin untuk membebaskan yang sebelumnya setelah penambahan satu elemen baru? haruskah saya menggunakan rm ()?
ligwin

Ada masalah lain bahwa typeof (numeric (0)) memberikan "double" sedangkan elemen yang diinginkan memberikan "integer", ketika ditambahkan, muncul kesalahan yang mengatakan "Jenis untuk nilai baru tidak bisa berbeda", bagaimana cara mengubahnya?
ligwin

saat bekerja di python, "as" adalah kata kunci, sebagai tambahan, python tidak memiliki tipe data seperti itu, jadi menurut saya "as.integer" tidak akan berfungsi?
ligwin

romunov - numerik (0) berarti membuat vektor numerik dengan panjang 0 (yaitu tidak ada elemen) bukan vektor dengan panjang 1 dengan elemen itu 0
Aaron Statham

7

Untuk membuat penggunaan vektor kosong:

vec <- c();

Harap dicatat, saya tidak membuat asumsi apa pun tentang jenis vektor yang Anda butuhkan, misalnya numerik.

Setelah vektor dibuat, Anda dapat menambahkan elemen ke dalamnya sebagai berikut:

Misalnya, untuk menambahkan nilai numerik 1:

vec <- c(vec, 1);

atau, untuk menambahkan nilai string "a"

vec <- c(vec, "a");

4
Apakah Anda benar-benar mencoba ini? vec <- c()set vec ke NULL. Jika Anda menginginkan vektor kosong, Anda akan menggunakan vec <- character(), vec <- numeric()dll.
Matthew Wise

5

Saya juga melihat

x <- {}

Sekarang Anda dapat menggabungkan atau mengikat vektor dari dimensi apa pun ke x

rbind(x, 1:10)
cbind(x, 1:10)
c(x, 10)

2
Ini persis sama dengan x <- NULL, dan tidak membuat apa pun selain referensi ke mana-mana.
Joris Meys

3

Seperti yang ditunjukkan oleh Brani, vektor () adalah solusi, misalnya

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

akan mengembalikan vektor bernama "newVector" dengan 50 "0" sebagai nilai awal. Ini juga cukup umum untuk menambahkan skalar baru ke vektor yang ada untuk sampai pada vektor yang diperluas, misalnya

aVector <- c(aVector, newScalar)


2

Di rpy2, cara untuk mendapatkan operator yang sama dengan "[" dengan R adalah menggunakan ".rx". Lihat dokumentasi tentang mengekstrak dengan rpy2

Untuk membuat vektor, jika Anda memahami cara Anda menggunakan Python seharusnya tidak ada masalah. Lihat dokumentasi tentang membuat vektor


Saya biasa membuat fungsi dengan python untuk tujuan ini, yang sangat rumit dan saya tidak yakin seberapa luas penerapannya. Sekarang saya pikir dengan operator ini, hidup bisa jauh lebih mudah :)
ligwin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.