วิธีสร้างเวกเตอร์ R ว่างเพื่อเพิ่มรายการใหม่


93

ฉันต้องการใช้ R ใน Python ตามที่โมดูล Rpy2 ให้มา ฉันสังเกตเห็นว่า R มี[]การดำเนินการที่สะดวกมากซึ่งคุณสามารถแยกคอลัมน์หรือบรรทัดเฉพาะได้ ฉันจะบรรลุฟังก์ชันดังกล่าวโดยสคริปต์ Python ได้อย่างไร

ความคิดของฉันคือการสร้างเวกเตอร์ R และเพิ่มองค์ประกอบที่ต้องการลงในเวกเตอร์นี้เพื่อให้เวกเตอร์สุดท้ายเหมือนกับใน R ฉันสร้าง a seq()แต่ดูเหมือนว่ามันจะมีตัวเลขเริ่มต้น 1 ดังนั้นผลลัพธ์สุดท้ายจะเสมอ เริ่มต้นด้วยหลัก 1 ซึ่งไม่ใช่สิ่งที่ฉันต้องการ แล้วมีวิธีที่ดีกว่านี้ไหม?

คำตอบ:



56

ฉันจัดสรรเวกเตอร์ล่วงหน้าด้วย

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

จากนั้นคุณสามารถใช้ [] เพื่อแทรกค่าลงไปได้


นี่คือคำตอบที่ดีที่สุดหากทราบความยาวของเวกเตอร์ตั้งแต่เริ่มแรกเนื่องจากจะมีประสิทธิภาพในการจำมากที่สุด
stevec

25

คุณสามารถสร้างเวกเตอร์ว่างได้เช่นนั้น

vec <- numeric(0)

แล้วเพิ่มองค์ประกอบโดยใช้ c ()

vec <- c(vec, 1:5)

อย่างไรก็ตามตามที่ romunov กล่าวไว้การจัดสรรเวกเตอร์ล่วงหน้าแล้วเติมข้อมูลนั้นจะดีกว่ามาก (เนื่องจากเป็นการหลีกเลี่ยงการจัดสรรสำเนาเวกเตอร์ใหม่ทุกครั้งที่คุณเพิ่มองค์ประกอบ)


ฉันชอบวิธีแก้ปัญหาของคุณด้วยตัวเลข () แต่ประสบการณ์ของฉันทำให้ฉันใช้ NA แทน 0 (ถ้าคุณใช้ตัวเลข (2) คุณจะได้ 0 0) แต่นั่นเป็นความชอบส่วนตัวของฉัน
Roman Luštrik

ขอบคุณมาก!! แต่เป็นไปได้ไหมที่จะปลดปล่อยองค์ประกอบก่อนหน้าหลังจากเพิ่มองค์ประกอบใหม่หนึ่งรายการ ฉันควรใช้ rm () หรือไม่
ligwin

มีปัญหาอีกอย่างที่ typeof (ตัวเลข (0)) ให้ "double" ในขณะที่องค์ประกอบที่ต้องการจะให้ "integer" เมื่อเพิ่มเข้าไปจะเกิดข้อผิดพลาดขึ้นว่า "The type for the new value can't be different" จะแปลงอย่างไร
ligwin

เมื่อทำงานใน python "as" เป็นคีย์เวิร์ดนอกจากนี้ python ไม่มีชนิดข้อมูลดังกล่าวดังนั้นฉันคิดว่า "as.integer" จะไม่ทำงาน?
ligwin

romunov - ตัวเลข (0) หมายถึงสร้างเวกเตอร์ตัวเลขที่มีความยาวเป็น 0 (เช่นไม่มีองค์ประกอบ) ไม่ใช่เวกเตอร์ที่มีความยาว 1 โดยองค์ประกอบนั้นเป็น 0
Aaron Statham

7

ในการสร้างเวกเตอร์ว่างให้ใช้:

vec <- c();

โปรดทราบว่าฉันไม่ได้ตั้งสมมติฐานเกี่ยวกับประเภทของเวกเตอร์ที่คุณต้องการเช่นตัวเลข

เมื่อสร้างเวกเตอร์แล้วคุณสามารถเพิ่มองค์ประกอบได้ดังนี้:

ตัวอย่างเช่นในการเพิ่มค่าตัวเลข 1:

vec <- c(vec, 1);

หรือเพื่อเพิ่มค่าสตริง "a"

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

4
คุณได้ลองสิ่งนี้จริงหรือไม่? vec <- c()ชุด vec NULLไป ถ้าคุณต้องการเวกเตอร์ที่ว่างเปล่าที่คุณจะใช้vec <- character(), vec <- numeric()ฯลฯ
แมทธิวปรีชาญาณ

5

ฉันยังเคยเห็น

x <- {}

ตอนนี้คุณสามารถเชื่อมต่อหรือผูกเวกเตอร์ของมิติใดก็ได้ x

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

2
สิ่งนี้เหมือนกับx <- NULLและไม่ได้สร้างสิ่งอื่นใดนอกจากการอ้างอิงถึงที่ไหนเลย
Joris Meys

3

ตามที่ Brani ชี้ให้เห็นเวกเตอร์ () คือคำตอบเช่น

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

จะส่งคืนเวกเตอร์ชื่อ "newVector" โดยมี 50 "0" เป็นค่าเริ่มต้น มันเป็นเรื่องธรรมดาที่จะเพิ่มสเกลาร์ใหม่ให้กับเวกเตอร์ที่มีอยู่เพื่อให้ได้เวกเตอร์ที่ขยายออกเช่น

aVector <- c(aVector, newScalar)


2

ใน rpy2 วิธีรับตัวดำเนินการเดียวกันกับ "[" กับ R คือการใช้ ".rx" ดูเอกสารเกี่ยวกับการแตกไฟล์ด้วย rpy2

สำหรับการสร้างเวกเตอร์หากคุณรู้จักวิธีการใช้ Python ก็ไม่น่าจะมีปัญหาใด ๆ ดูเอกสารเกี่ยวกับการสร้างเวกเตอร์


ฉันเคยสร้างฟังก์ชันใน python เพื่อจุดประสงค์นี้ซึ่งมีความซับซ้อนมากและฉันไม่แน่ใจว่าจะใช้งานได้กว้างขวางแค่ไหน ตอนนี้ฉันคิดว่ากับโอเปอเรเตอร์นี้ชีวิตจะง่ายขึ้นมาก :)
ligwin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.