在R中将字符串转换为变量名

10

我正在清理一组数据,需要根据另一个变量选择变量。假设 ID = 1,我需要在数据框中添加变量 VAR01,如果 ID = 2,我需要 VAR02,以此类推。

因此,我正在使用for循环,在其中使用stringf函数将变量名“VAR”与ID数字拼接起来。问题是,我需要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

有人有解决方案吗?

谢谢!


你能否尝试举一个例子,说明你的数据是什么,以及期望得到的输出是什么? - alexwhan
3个回答

11

你可以使用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

如果你想在函数调用后保留变量的值,那么你需要指定一个环境,在这个环境中,变量会一直存在于你的任务运行期间。例如,在全局环境中:

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函数不会轻易地分配到数据框中(正如问题的第一部分所提到的)。另请参见fortune(236) - Greg Snow

5
您可以使用get
result = get(var_name)

虽然频繁使用getset可能表明您应该开始使用变量的list

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

我认为他想把1、2、3分别指派给周一、周二和周三...?不过我也不能确定我理解得对不对。 - Arun
这正是标题所说的,而且原帖作者应该在这种情况下使用列表。 - Paul Hiemstra

3

这是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)


+1 for fortune(106):如果答案是parse(),你通常应该重新思考问题。 —Thomas Lumley - R-help(2005年2月) - zx8754

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接