2013-03-07 36 views
8

我在清理數據集,我需要根據另一個變量選擇變量。假設如果ID = 1,我需要在數據幀中引入變量VAR01,如果ID = 2,我需要VAR02等等。字符串到R中的變量名稱

因此,我正在做一個for循環,我用stringf函數粘貼帶有ID號的變量名'VAR'。問題是我需要R將字符串理解爲函數名。

我在論壇發現了這個解決方案,它不爲我工作:

> variable1 = c("monday", "tuesday", "wednesday") 

> var_name = "variable1" 

> eval(parse(text=var_name)) 
[1] "monday" "tuesday" "wednesday" 

問題是我不能用它來引用變量:

> eval(parse(text=var_name)) = c(1,2,3) 
Error in file(filename, "r") : cannot open the connection 
In addition: Warning message: 
In file(filename, "r") : 
cannot open file 'variable1': No such file or directory 

有任何人都有解決辦法?

謝謝!

+0

你可以嘗試舉一個你的數據是什麼樣的例子,以及所需的輸出嗎? – alexwhan 2013-03-07 12:01:16

回答

5

您可以使用get

result = get(var_name) 

雖然大量使用getset建議您可能要開始使用的變量list的,而不是:

l = list(variable1 = c(1,2,3)) 
l$variable1 = c(4,5,6) 
+0

我認爲他想分別給1,2,3星期一,星期二和星期三..?不知道,如果我說得對的話。 – Arun 2013-03-07 11:59:29

+0

這確實是標題所說的,在這種情況下OP應該使用列表。 – 2013-03-07 12:00:58

9

您可以使用assign()

var_name <- 'test' 
assign(var_name,1:3) 
test 

注意:assign會在調用它的環境中創建變量。所以,如果你是這樣的函數中調用assign

myfun <- function(var) { 
    assign(eval(substitute(var)), 5) 
    print(get(var)) 
} 

調用函數分配my_var的功能,它的環境,纔會創建爲運行該功能,並破壞後的時間內值爲5。

> myfun("my_var") 
# [1] 5 

> my_var 
# Error: object 'my_var' not found 

所以,如果你想有一個函數調用後保留的價值,那麼,你就必須指定一個環境中,你將有救援人員到場時,您的任務運行的變量。例如,在global environment中:

myfun <- function(var, env = globalenv()) { 
    assign(eval(substitute(var)), 5, envir = env) 
    print(get(var)) 
} 

> myfun("my_var") 
# [1] 5 
> my_var 
# [1] 5 
+2

'assign'函數不會輕易分配到數據框中(如問題的第一部分所述)。另見'財富(236)'。 – 2013-03-07 23:01:56

2

這是FAQ 7.21。

該FAQ中最重要的部分是告訴您使用列表的最終位置,而不是在全球環境中執行此操作。你提到你想在一個數據框(這已經是一個列表)中做到這一點,所以這變得更簡單。嘗試是這樣的:

mydf <- data.frame(g=c('a','b','c')) 
ID <- 1 

mydf[[ sprintf("VAR%02d",ID) ]] <- 1:3 
mydf 

使用在這種情況下eval(parse(text=...))好像是在說,你知道如何從紐約到波士頓,因此要求從產地到紐約到目的地的路線和方向從波士頓。在某些情況下,這可能不會太糟糕,但如果你想從倫敦到巴黎(而你的例子是你通過火星從紐約經過波士頓到波士頓),這有點偏離正軌。見fortune(106)

+0

+1 [財富(106)](http://cran.r-project.org/web/packages/fortunes/vignettes/fortunes.pdf):如果答案是parse(),你通常應該重新思考這個問題。 -Thomas Lumley - R-help(2005年2月) – zx8754 2013-08-06 13:15:58