值名称为assign函数中的字符串

时间:2015-05-27 01:22:22

标签: r string object assign

我想在循环中使用不同的数据帧。我在访问循环中的不同数据帧时遇到问题。

Data1<-data.frame(X=rnorm(100,2), Y=rnorm(200,2), Z=rnorm(200,2))
Data2<-data.frame(X=rnorm(300,500), Y=rnorm(300,500))
Data3<-data.frame(X=rnorm(500,200), Y=rnorm(20,200))

for (i in c(1:3)){
assign("CurrentData", paste("Data", i, sep=""))
colMeans(CurrentData)
}

assign函数不能满足我的要求,因为它认为第二个参数是字符串而不是对象的名称。我怎么能绕过这个?

2 个答案:

答案 0 :(得分:4)

请参阅?assign

assign(x, value)其中x是变量名称,value是要分配给该变量名称的对象

目前,你有这个:

...
assign("CurrentData", paste("Data", i, sep=""))
## This is equivalent to: CurrentData <- "Data1" 
... 

您正在为CurrentData分配字符串值:&#34; Data1&#34;,&#34; Data2&#34;,&#34; Data3&#34;但不是同名对象本身的价值。

尝试使用?get。像这样:

...
assign("CurrentData", get(paste("Data",i,sep="")))
...

奖金:

为此目的,您最好使用colMeans(x)

答案 1 :(得分:2)

你的assign语句必须像这样

assign("CurrentData", eval(as.name(paste("Data", i, sep="")))

as.name的调用将字符串转换为符号名称,然后eval实际获取符号的值。

还有其他方法可以做到,但这清楚地表达了意图。

实现你想要的更简单的方法就是这个

Data1<-data.frame(X=rnorm(100,2), Y=rnorm(200,2), Z=rnorm(200,2))
Data2<-data.frame(X=rnorm(300,500), Y=rnorm(300,500))
Data3<-data.frame(X=rnorm(500,200), Y=rnorm(20,200))

for (CurrentData in list(Data1, Data2, Data3)){
    somefunction(CurrentData)
}

注意我使用list来避免所有数据帧被强制转换为一个大向量。