Hen*_*ndy 48 variables r string-concatenation
相关:字符串作为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)
Run Code Online (Sandbox Code Playgroud)
现在,我想从这些中制作一个泡泡图.我有一个更复杂的数据集,有3种颜色和复杂的子集,但我这样做:
symbols(set1$sq,set1$cu,circles=set1$num,bg="red")
symbols(set2$sq,set2$cu,circles=set2$num,bg="blue",add=T)
Run Code Online (Sandbox Code Playgroud)
我想像这样做一个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)
}
Run Code Online (Sandbox Code Playgroud)
我知道你可以通过评估变量来指定列(比如var="cu"; set1[,var];我想知道如何获取变量来指定data.frame本身(以及另一个来评估列).
更新:跑过这个职位上的R-博客拥有这个例子:
x <- 42
eval(parse(text = "x"))
[1] 42
Run Code Online (Sandbox Code Playgroud)
我现在可以这样做:
eval(parse(text=paste(set[[1]],"$",var1,sep="")))
Run Code Online (Sandbox Code Playgroud)
在摆弄这个问题时,我觉得有趣的是以下内容并不等同:
vars <- data.frame("var1","var2")
eval(parse(text=paste(set[[1]],"$",var1,sep="")))
eval(parse(text=paste(set[[1]],"[,vars[[1]]]",sep="")))
Run Code Online (Sandbox Code Playgroud)
我实际上必须这样做:
eval(parse(text=paste(set[[1]],"[,as.character(vars[[1]])]",sep="")))
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
我得到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)
Run Code Online (Sandbox Code Playgroud)
为什么在符号函数中存储为变量与执行时的不同行为?
Car*_*oft 36
你找到了一个答案,即eval(parse()).您还可以调查do.call()哪些通常更容易实现.请记住as.name() 用于将字符串转换为变量名称的有用工具.
CJB*_*CJB 17
标题中问题的基本答案是eval(as.symbol(variable_name_as_string))Josh O'Brien使用的.例如
var.name = "x"
assign(var.name, 5)
eval(as.symbol(var.name)) # outputs 5
Run Code Online (Sandbox Code Playgroud)
或者更简单:
get(var.name) # 5
Run Code Online (Sandbox Code Playgroud)
没有任何示例数据,确实很难确切地知道您想要什么.例如,我无法理解你的对象set(或它sets)的样子.
那就是说,有以下帮助吗?
set1 <- data.frame(x = 4:6, y = 6:4, z = c(1, 3, 5))
plot(1:10, type="n")
XX <- "set1"
with(eval(as.symbol(XX)), symbols(x, y, circles = z, add=TRUE))
Run Code Online (Sandbox Code Playgroud)
编辑:
现在我看到了你真正的任务,这里是一个单行程,它可以做你想要的一切而不需要任何for()循环:
with(dat, symbols(sq, cu, circles = num,
bg = c("red", "blue")[(num>5) + 1]))
Run Code Online (Sandbox Code Playgroud)
可能感觉奇怪的一位代码是指定背景颜色的位.尝试这两行,看看它是如何工作的:
c(TRUE, FALSE) + 1
# [1] 2 1
c("red", "blue")[c(F, F, T, T) + 1]
# [1] "red" "red" "blue" "blue"
Run Code Online (Sandbox Code Playgroud)
小智 8
如果要将字符串用作变量名,可以使用assign:
var1="string_name"
assign(var1, c(5,4,5,6,7))
string_name
[1] 5 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
86384 次 |
| 最近记录: |