在R中,我正在编写一个for循环,它将迭代地创建变量名,然后为每个变量赋值。
这是一个简化版本。目的是根据迭代变量i的值创建变量的名称,然后用NA值填充新变量。
(我只是在下面1:1迭代,因为问题发生与循环本身无关,而是与创建和分配变量的方式有关。)
for (i in 1:1) {
#name variable i "Variablei"
varName = paste("Variable", as.character(i), sep="")
#fill variable with NA values
varName = rep(NA, 12)
print(varName)
print(Variable1)
}
现在,varName打印为
[1] NA NA NA NA NA NA NA NA NA NA NA NA
找不到和Variable1。
我在某种程度上理解为什么这是错误的。在第一行中,varName成为一个向量,其唯一的条目是字符串“Variable1”。然后重新分配varName以保存NA值。因此,当我尝试打印Variable1时,它不存在。
我认为更普遍的问题是任务与平等。在第一行中,我希望varName与等于新创建的字符串,但在下一行中,我希望将varName分配给 NA值向量。< / p>
创造这种区别的最简单方法是什么?我也愿意接受完全不同的,更好的方法来解决这个问题。
编辑:更改了标题,因为我错误地描述了问题。
答案 0 :(得分:12)
作业的作用如下:
<varname> = <expression>
或更传统
<varname> <- <expression>
因此,在您的代码中,您只被分配到varName
。这不是关于任务与平等,只是分配。您可能需要查看assign
:
for (i in 1:5) {
assign(paste0("Variable", i), 10*i)
}
作为玩具的例子。
此外,正如评论中所述,您的应用程序可能有更好的方法。例如,为什么不使用向量myvector
而不是使用名为Variable1
,Variable2
等变量,您可以参考myvector[1]
,myvector[2]
等。
例如,我们假设您已计划使用
Variable1 <- 'foo'
Variable2 <- 'bar'
Variable3 <- 'baz'
然后,您可以改变方法,并设置
mydata <- c('foo', 'bar', 'baz')
以及您之前使用Variable2
(包含'bar'
)的位置,而是使用mydata[2]
(其中还包含'bar'
)。这里的要点是,使用R中的向量和数据帧比使用一长串变量更容易。
您可以进一步命名条目:
names(mydata) <- paste0("V", 1:3)
然后允许您编写mydata["V2"]
来检索bar
。