9

我正在清理数据集,我需要根据另一个变量选择变量。假设如果ID = 1,我需要在数据框中引入变量VAR01,如果ID = 2,我需要VAR02,等等。

因此,我正在执行一个 for 循环,在其中将带有 ID 号的变量名“VAR”粘贴到stringf函数中。问题是我需要 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

有没有人有解决方案?

谢谢!

4

3 回答 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

因此,如果您想在函数调用后保留该值,那么您必须指定一个环境,您将在任务运行时拥有变量 thro'。例如,在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
于 2013-03-07T12:12:56.727 回答
5

您可以使用get

result = get(var_name)

尽管大量使用getandset建议您可能希望开始使用list's of variables 来代替:

l = list(variable1 = c(1,2,3))
l$variable1 = c(4,5,6) 
于 2013-03-07T11:58:32.750 回答
3

这是常见问题解答 7.21。

该常见问题解答中最重要的部分是它告诉您使用列表而不是在全局环境中这样做的结尾。您提到您想在数据框(已经是一个列表)中执行此操作,因此这变得更简单。尝试类似:

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

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

在这种情况下使用eval(parse(text=...))就像说您知道如何从纽约市到波士顿,因此询问从您的出发地到纽约的路线以及从波士顿到您的目的地的路线。在某些情况下,这可能并不算太糟糕,但如果您试图从伦敦到巴黎(您的示例是您从纽约经火星前往波士顿),那就有点偏了。见fortune(106)

于 2013-03-07T23:00:05.890 回答