【问题标题】:Use values from one vector to change values in another vector in R (for loop)使用一个向量中的值来更改 R 中另一个向量中的值(for 循环)
【发布时间】:2020-07-05 10:53:18
【问题描述】:

我需要根据另一个向量中相同位置的值来更改一个向量中的某些值。以下是我的向量:

r <- (1:20)
a <- c(54,54,54,54,55,55,50,0,0,0,0,0,0,1,1,1,1,1,56,57)

基本上,如果 'a' 中的任何值大于或等于且小于 20(因此 a 中的任何值是 0-20),我想将 'r' 中的值更改为自身 -1 .如果 'a' 中的值大于 20 或小于 0,那么我希望它在 'r' 中的值保持不变。因此,对于“a”中的第 8 个点,该值为 0,大于/等于 0 且小于 20,所以我希望“r”中的第 8 个点(值为 8)减去 1(所以现在它的值将是 7)。但是对于“a”中的第一个点,该值为 54,大于 20,因此 r 中的第一个值将保持不变。我以为我需要为此编写一个 for 循环,我开始这样做,但它没有做我需要它做的事情。这是我目前所拥有的。

for(i in a){
  if (i >= 0 && i < 20){
    r[i] = r[i]-1
  } else {
    r[i] = r[i]
  }
}

当我运行这段代码时,它会返回 r

[1] -4  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 NA NA NA NA NA NA NA NA NA NA NA
[32] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

我怎样才能让它返回如下所示的正确结果:

[1] 1 2 3 4 5 6 7 7 8 9 10 11 12 13 14 15 16 17 19 20

谢谢!

【问题讨论】:

  • 感谢到目前为止回答的人!我也刚刚意识到一个潜在的问题。这些向量只是我目前实际使用的数据的 sn-ps。 'r' 向量实际上是一天中的一个小时(所以 0 到 23 重复,这里和那里缺少一些小时)并且重复大约 3 个月。例如,如果将此代码用于 0 小时,则从中减去 1 会使小时为 -1,但我希望它是 23 小时或之前的任何小时数。您在下面发布的解决方案仍然适用吗?请告诉我,谢谢。

标签: r for-loop if-statement iteration


【解决方案1】:

也许这会有所帮助,

r <- (1:20)
a <- c(54,54,54,54,55,55,50,0,0,0,0,0,0,1,1,1,1,1,56,57)

r[a >= 0 & a < 20] <- r[a >= 0 & a < 20] - 1

# [1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20

这里不需要循环,上面的答案是最有效的。

【讨论】:

    【解决方案2】:

    我们可以循环遍历序列

    for(i in seq_along(a)) if(a[i] >=0 && a[i] < 20) r[i] <- r[i] -1 
    r
    #[1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20
    

    而不是 'a' 的值,因为 r[54] 不存在并且在该元素上分配会导致 NA

    【讨论】:

      【解决方案3】:

      我想一个紧凑的基础 R 解决方案是使用 ifelse

      ifelse(a>=0 & a< 20,r-1,r)
      

      给了

      > ifelse(a>=0 & a< 20,r-1,r)
       [1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        r - (a >= 0 & a < 20) 
        
        [1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 14 15 16 17 19 20
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-27
          • 2021-03-01
          • 1970-01-01
          • 2020-09-01
          • 1970-01-01
          相关资源
          最近更新 更多