2010-04-20 58 views
69

是否有可能在飛行中創建新的變量名稱?如何即時命名變量?

我想從列表中讀取數據幀到最後帶有數字的新變量。像orca1,ORCA2,orca3 ...

如果我嘗試像

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

我得到這個錯誤

target of assignment expands to non-language object 

有沒有解決這個另一種方式?

+7

只要我們發出r-faq標籤,讓我們給出鏈接(FAQ 7.21:http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I -turn-a-string-into-a-variable_003f) – 2011-05-19 14:33:43

回答

93

使用分配:

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

這是如何做到這一點。這裏有一個元問題,即「我應該這樣做嗎?」答案几乎總是「不」。列表中的命名元素幾乎總是首選。 – 2012-07-20 16:18:06

+17

答案几乎總是「否」,除非不是。 – Shane 2012-08-02 12:33:49

+8

當然好。但是大多數尋求這個答案的人並沒有因拒絕他們的申請表而被拒絕。 – 2012-08-02 13:15:49

30

在我看來,你可能會用一個列表更好,而不是使用orca1orca2,等等,......那麼這將是orca[1]orca[2],...

通常情況下,您正在製作一個由數字區分的變量列表,因爲該數字將是稍後訪問它們的便捷方式。

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

否則,assign正是你想要的。

+9

我同意。通常當人們認爲他們想立即命名變量時,他們真正想要的是一個不同的數據結構。 – 2010-04-21 05:55:16

+8

+1(FAQ 7.21:http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f)很好地討論了這一點 – 2011-05-19 14:35:14

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 
+13

棘手,但不明智。如果答案是「附加」,你通常會問錯誤的問題...... – 2011-05-19 14:34:42

9

不要使數據幀。保留清單,命名其元素,但不要附加它。

這樣做的最大原因是,如果您隨時隨地創建變量,則幾乎總是在稍後必須迭代每個變量才能執行一些有用的操作。在那裏,你將再次被迫迭代你在飛行中創建的每個名稱。

命名列表中的元素並遍歷名稱要容易得多。

就attach而言,它在R中的編程實踐非常糟糕,如果不小心可能會導致很多麻煩。

-2

而這個選項?

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

它完美地工作。在你放的例子中,第一行缺失,然後給你錯誤信息。

+3

這並沒有解決OP的問題。我們有一個帶有數據框的列表,我們想把它分配給數據框,命名爲orca1,orca2等。 – zx8754 2016-10-27 19:57:02