相关问题:R中字符串作为变量引用
可能相关:连接表达式以对数据框进行子集操作
根据评论请求,我简化了问题。以下是一些示例数据。
dat <- data.frame(num=1:10,sq=(1:10)^2,cu=(1:10)^3)
set1 <- subset(dat,num>5)
set2 <- subset(dat,num<=5)
现在,我想从这些数据中制作一个气泡图。我有一个更复杂的数据集,有三种以上的颜色和复杂的子集,但我可以像这样做:
symbols(set1$sq,set1$cu,circles=set1$num,bg="red")
symbols(set2$sq,set2$cu,circles=set2$num,bg="blue",add=T)
我希望能够像这样使用for循环:
colors <- c("red","blue")
sets <- c("set1","set2")
vars <- c("sq","cu","num")
for (i in 1:length(sets)) {
symbols(sets[[i]][,sq],sets[[i]][,cu],circles=sets[[i]][,num],
bg=colors[[i]],add=T)
}
我知道您可以使用变量来指定列(例如
var="cu"; set1[,var]
),但我想知道如何使用变量来指定数据框本身(以及另一个变量来评估列)。
更新:在r-bloggers上看到了这篇文章,其中有这个例子。
x <- 42
eval(parse(text = "x"))
[1] 42
我现在能够做到这样的事情:
eval(parse(text=paste(set[[1]],"$",var1,sep="")))
在处理这个问题时,我发现以下内容并不等价:
在对此进行尝试时,我发现以下内容并不等价:
vars <- data.frame("var1","var2")
eval(parse(text=paste(set[[1]],"$",var1,sep="")))
eval(parse(text=paste(set[[1]],"[,vars[[1]]]",sep="")))
我实际上需要做这个:
eval(parse(text=paste(set[[1]],"[,as.character(vars[[1]])]",sep="")))
更新2:上述操作可以输出值,但无法绘制。我不能执行以下操作:
for (i in 1:length(set)) {
symbols(eval(parse(text=paste(set[[i]],"$",var1,sep=""))),
eval(parse(text=paste(set[[i]],"$",var2,sep=""))),
circles=paste(set[[i]],".","circles",sep=""),
fg="white",bg=colors[[i]],add=T)
}
我收到了“无效符号坐标”的错误提示。我检查了set[[1]]的类别,发现它是一个因子(fator)。如果我执行is.numeric(as.numeric(set[[1]]))
,会得到TRUE
的结果。即使在eval
语句之前加入这个操作,我仍然会收到同样的错误提示。但是奇怪的是,我可以执行以下操作:
set.xvars <- as.numeric(eval(parse(text=paste(set[[i]],"$",var1,sep=""))))
set.yvars <- as.numeric(eval(parse(text=paste(set[[i]],"$",var2,sep=""))))
symbols(xvars,yvars,circles=data$var3)
为什么存储为变量和在符号函数中执行时行为不同?
dput
给我们提供一些示例数据,那将非常有帮助。 - Maiasauravar1=42; foo="var1"; get(foo);
是另一种通过字符串获取变量的方法。 - Maiasaura