จะตั้งชื่อตัวแปรได้อย่างไร?


99

สามารถสร้างชื่อตัวแปรใหม่ได้ทันทีหรือไม่?

ฉันต้องการอ่าน data frames จากรายการไปยังตัวแปรใหม่พร้อมตัวเลขต่อท้าย บางอย่างเช่น orca1, orca2, orca3 ...

ถ้าลองของชอบ

paste("orca",i,sep="")=list_name[[i]]

ฉันได้รับข้อผิดพลาดนี้

target of assignment expands to non-language object

มีวิธีอื่นอีกไหม


10
ตราบใดที่เราแจกแท็ก r-faq ให้ลิงค์ (คำถามที่พบบ่อย 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

คำตอบ:


121

ใช้assign:

assign(paste("orca", i, sep = ""), list_name[[i]])

28
นี่คือวิธีการทำ มีคำถามเมตาอยู่ที่นี่ซึ่งก็คือ "ฉันควรทำหรือไม่" คำตอบคือ "ไม่" เกือบตลอดเวลา องค์ประกอบที่มีชื่อในรายการมักจะเป็นที่ต้องการ
Ari B. Friedman

26
คำตอบคือ "ไม่" เกือบตลอดเวลายกเว้นเมื่อมันไม่ใช่
เชน

9
แน่นอน. แต่คนส่วนใหญ่ที่กำลังมองหาคำตอบนี้ไม่ได้ทำเช่นนั้นจากตำแหน่งที่ปฏิเสธรายชื่อใบสมัคร
Ari B. Friedman

@Ari B. Friedman ฉันสร้างชื่อตัวแปรสำหรับชุดข้อมูลที่ฉันบันทึกใน mypackage / data แต่ละไฟล์ในไฟล์ที่มีชื่อเดียวกันสำหรับไฟล์และข้อมูลในไฟล์ (ให้คำแนะนำ R สำหรับข้อมูลในแพ็คเกจ) ชุดข้อมูลแต่ละชุดมีขนาดประมาณ 10M และรวมเป็น ~ 17Go ฉันแทบจะไม่เห็นวิธีอื่น
cmbarbu

4
มีเหตุผลอะไรที่คุณไม่ใช้paste0?
BroVic

33

มันดูเหมือนว่าฉันว่าคุณอาจจะดีกว่ากับรายการแทนที่จะใช้orca1, orca2ฯลฯ ... แล้วมันจะเป็นorca[1], orca[2]...

โดยปกติคุณจะสร้างรายการตัวแปรที่แตกต่างโดยไม่มีอะไรเลยนอกจากตัวเลขเพราะตัวเลขนั้นจะเป็นวิธีที่สะดวกในการเข้าถึงในภายหลัง

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

มิฉะนั้นassignเป็นเพียงสิ่งที่คุณต้องการ


11
ฉันเห็นด้วย. โดยปกติเมื่อผู้คนคิดว่าพวกเขาต้องการตั้งชื่อตัวแปรทันทีสิ่งที่พวกเขาต้องการคือโครงสร้างข้อมูลที่แตกต่างกัน
Michael Dunn

9
+1 (คำถามที่พบบ่อย 7.21: cran.r-project.org/doc/FAQ/… ) พูดถึงเรื่องนี้อย่างดี
Ben Bolker

11

อย่าสร้างกรอบข้อมูล เก็บรายการตั้งชื่อองค์ประกอบ แต่ไม่แนบ

เหตุผลที่ใหญ่ที่สุดคือถ้าคุณสร้างตัวแปรในระหว่างการเดินทางเกือบตลอดเวลาในภายหลังคุณจะต้องวนซ้ำแต่ละตัวแปรเพื่อทำสิ่งที่เป็นประโยชน์ ที่นั่นอีกครั้งคุณจะถูกบังคับให้ทวนชื่อแต่ละชื่อที่คุณสร้างขึ้นทันที

มันง่ายกว่ามากในการตั้งชื่อองค์ประกอบของรายการและทำซ้ำตามชื่อ

เท่าที่เกี่ยวข้องกับสิ่งที่แนบมาการฝึกเขียนโปรแกรมใน R ที่แย่มากและอาจทำให้เกิดปัญหามากมายหากคุณไม่ระวัง


ดังนั้นให้ทำการแนบ แต่หลังจากทำการวนซ้ำผ่านรายการเท่านั้น
Mox

4

คำถามที่พบบ่อยกล่าวว่า:

ถ้าคุณมี

varname <- c("a", "b", "d")

คุณทำได้

get(varname[1]) + 2

สำหรับ

a + 2

หรือ

assign(varname[1], 2 + 2)

สำหรับ

a <- 2 + 2

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

ไวยากรณ์สำหรับการกำหนด: กำหนด (x, ค่า)

x:ชื่อตัวแปรที่กำหนดเป็นสตริงอักขระ ไม่มีการบีบบังคับใด ๆ และจะใช้องค์ประกอบแรกของเวกเตอร์อักขระที่มีความยาวมากกว่าหนึ่งพร้อมคำเตือน

value:ค่าที่จะกำหนดให้กับ x


0

อีกวิธีหนึ่งที่ยุ่งยากคือการตั้งชื่อองค์ประกอบของรายการและattach:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

14
มีเล่ห์เหลี่ยม แต่ไม่ฉลาด หากคำตอบคือattachคุณมักจะถามคำถามผิด ...
Ben Bolker

-1

และตัวเลือกนี้?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

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


3
สิ่งนี้ไม่ได้ตอบคำถามของ OP เรามีรายการที่มีดาต้าเฟรมและเราต้องการกำหนดให้กับดาต้าเฟรมโดยตั้งชื่อว่า orca1, orca2 เป็นต้น
zx8754

"List with dataframes" = "list of dataframes"?
Mox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.