我正在清理数据集,我需要根据另一个变量选择变量。假设如果ID = 1
,我需要在数据框中引入变量VAR01
,如果ID = 2
,我需要VAR02
,依此类推。
因此,我正在进行for循环,我将变量名称'VAR'与ID号一起粘贴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
有没有人有解决方案?
谢谢!
答案 0 :(得分:10)
您可以使用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
答案 1 :(得分:5)
您可以使用get
:
result = get(var_name)
尽管大量使用get
和set
表示您可能希望开始使用list
的变量:
l = list(variable1 = c(1,2,3))
l$variable1 = c(4,5,6)
答案 2 :(得分: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)
。