2013-03-07 35 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