无法减少R中“for”循环内的循环变量

时间:2014-06-26 13:13:33

标签: r

我有一个for循环来在R中进行矩阵操作。对于某些检查是真的,我需要再次来到同一行。,意味着i需要减少1。

for(i in 1:10)
{
    if(some chk)
    {
    i=i-1
    }
}

实际上i对我来说并没有减少。对于第5行中的示例,我将i减少到4,所以它应该再次变为5,但它将变为6。 请指教。

我的意图是: 检查矩阵的第一列值,如果找到任何重复值,我将获取第二列值并附加第一行的第二列并删除重复行。所以,当我删除一行时,我不需要在while循环中增加i。 (这只是一个map reduce方法,附加相同键的值)

1 个答案:

答案 0 :(得分:3)

R for循环中的变量是只读的,您无法修改它们。在正常的R代码中你所写的内容将完全不同地解决 - 根据实际问题的确切解决方案,没有通用的直接替换(除非用while循环替换整个东西,但这是既丑陋又可能是不必要的。)

为了说明这一点,请考虑这两个典型的例子。

  1. 假设您要过滤列表中的所有重复元素。您可以使用duplicated函数告诉您每个元素是否重复,而不是循环遍历列表并复制所有重复元素。

    其次,您使用standard R subsetting syntax来选择那些不重复的元素:

    x = x[! duplicated(x)]
    

    (此示例适用于一维向量或列表,但可以推广到更多维度。)

  2. 对于更复杂的情况,假设您有一个数字向量,并且对于向量中的每个偶数数字,您希望将前一个数字加倍(这是高度人工的但在信号处理中你可能会遇到类似的问题)。换句话说:

    input = c(1, 3, 2, 5, 6, 7, 1, 8)
    output = ???
    output
    # [1]  1  6  2 10  6  7  2  8
    

    ...我们想填写???。在第一步中,我们检查哪些数字是偶数:

    even = input %% 2 == 0
    # [1] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE
    

    接下来,我们将结果向下移动 - 因为我们想知道 next 数字是否是偶数 - 通过删除第一个元素,并在其中附加一个虚拟元素(FALSE)端。

    even = c(even[-1], FALSE)
    # [1] FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE
    

    现在我们可以将这些输入乘以两个:

    output = input
    output[even] = output[even] * 2
    

    在那里,完成。