对于R中的循环从其他值开始

时间:2013-05-02 19:38:18

标签: r loops

这一直困扰着我一段时间。想象一下,您必须/想要使用循环。

如果您编写循环,但想要从数字2开始,则使用以下内容:

for (i in 2:length(variable1) { ... }

当您尝试分配如下值时会出现问题:

variable2 <- 1:length(variable1)
for (i in 2:length(variable1) {
    variable2[i] <- sample(variable1, 1)  # silly example; ignore it content-wise
}

现在,无论你是否要初始化较小的向量,获得的变量2通常都会有问题,因为它在第一个位置有一个“1”。当你想从更高的数字开始时,处理for循环最简单的方法是什么?还有一种比使用i <- i+i更好的方法,因为我们必须让它从1运行到长度(variable1)减1.我错过了一个简单的解决方案吗?

在我看来,在for循环之前预定义变量的最佳方法是什么? 我通常使用variable2 <- 1:length(variable1),当我知道variable2应该是一个长度为variable1的变量时。这是分配内存的最快方法吗?

编辑:我刚才意识到这可能是最容易做到的:

variable2 <- 2:length(variable1)
for (i in 2:length(variable1) {
    variable2[i-1]
}

但我仍然愿意接受更好的建议。

3 个答案:

答案 0 :(得分:3)

Themel的答案很有效。

更一般地说,迭代时你可以使用几乎任何序列。所以我们可以

names <- c("Alice", "Bob", "Eve")
for(i in names) {
  print(i)
}

names <- c("Alice", "Bob", "Eve")
for(i in seq_along(names)) {
  print(names[i])
}

请参阅?seq_along以获得方便的入门读物。 seq_along()很好,因为它比自己指定数组边界更安全,如果你想遍历整个数组。

您可以按任意顺序进行迭代,例如for(i in c(3, 5, 12, 47)) { # do stuff }。如果你太狡猾,你会绊倒自己,但要记住你有这种灵活性。

在这种情况下,我唯一要改变的就是避免为结束创建变量,除非你计划让它不是向量的长度。这样:

from <- 2
for (i in from:length(variable)) { 
  variable2[i - from + 1] <- sample(variable1, 1)
} 

在R中循环也有很多种方法,有时候(尽管不总是如此),探索这些方法很有价值。

答案 1 :(得分:2)

不要硬编码起始索引。

from <- 2
to <- length(variable) 
for (i in from:to) { 
  variable2[i - from + 1] <- sample(variable1, 1)
} 

或者,如果你发现更具表现力

offset <- 1
to <- length(variable) 
for(i in (offset + 1):to) { 
  variable2[i-offset] <- sample(variable1, 1)
}

答案 2 :(得分:2)

嗯,通常的习惯用法可能是使用sapply并让它处理填写结果向量的簿记。像这样:

> sapply(2:5, function(x) {x*10})
[1] 20 30 40 50