【发布时间】:2012-02-21 20:12:18
【问题描述】:
相关:Strings as variable references in R
可能相关:Concatenate expressions to subset a dataframe
我已根据评论请求简化了问题。这里有一些示例数据。
dat <- data.frame(num=1:10,sq=(1:10)^2,cu=(1:10)^3)
set1 <- subset(dat,num>5)
set2 <- subset(dat,num<=5)
现在,我想根据这些制作一个气泡图。我有一个更复杂的数据集,包含 3 种以上的颜色和复杂的子集,但我做了这样的事情:
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];我想知道如何获取一个变量来指定 data.frame 本身(以及另一个来评估列)。
更新:在 r-bloggers 上遇到this post,其中有这个例子:
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="")))
Update2:以上内容可用于输出值...但不适用于尝试绘图。我做不到:
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)
}
我收到invalid symbol coordinates。我检查了 set[[1]] 的类,这是一个因素。如果我这样做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给我们一些示例数据也会很有帮助。 -
@Maiasaura:如果我的修订更清晰,请告诉我。我真的不认为数据是必要的,但如果你真的需要它,我会想出一些例子。
-
var1=42; foo="var1"; get(foo);是另一种获取以字符串命名的变量的方法。 -
@Maiasaura:是的,但我想要数据框的列。我知道我可以做你做的事,但做
get("data$var1")是行不通的。
标签: r variables string-concatenation