我有一个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方法,附加相同键的值)
答案 0 :(得分:3)
R for
循环中的变量是只读的,您无法修改它们。在正常的R代码中你所写的内容将完全不同地解决 - 根据实际问题的确切解决方案,没有通用的直接替换(除非用while
循环替换整个东西,但这是既丑陋又可能是不必要的。)
为了说明这一点,请考虑这两个典型的例子。
假设您要过滤列表中的所有重复元素。您可以使用duplicated
函数告诉您每个元素是否重复,而不是循环遍历列表并复制所有重复元素。
其次,您使用standard R subsetting syntax来选择那些不重复的元素:
x = x[! duplicated(x)]
(此示例适用于一维向量或列表,但可以推广到更多维度。)
对于更复杂的情况,假设您有一个数字向量,并且对于向量中的每个偶数数字,您希望将前一个数字加倍(这是高度人工的但在信号处理中你可能会遇到类似的问题)。换句话说:
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
在那里,完成。