【问题标题】:Conditional multiplication of vector entries向量条目的条件乘法
【发布时间】:2021-08-27 09:23:39
【问题描述】:

在 R 中,我有一个向量,其中每五个连续元素总是相等的

v=(a, a, a, a, a, a, b, b, b, 
   b,  b....)

我想将它与 [0.99,1.01] 中的值相乘,因为我想对条目进行轻微的变化,但平均值必须与以前保持一致,即前 5 个的平均值新向量的条目也必须是 a

如果 [0.99,1.01] 中的值是随机选择的(例如使用 runif),我更喜欢它,但如果使用随机数实现条件太复杂,确定性也可以。

非常感谢任何形式的帮助

【问题讨论】:

    标签: r vector


    【解决方案1】:

    必须有一种更简单的方法来做到这一点,但这是一个潜在的解决方案:

    library(tidyverse)
    vec1 <- rep(1:10, each = 5)
    vec2 <- c(0.98, 0.99, 1, 1.01, 1.02)
    
    vec3 <- c()
    for (i in split(vec1, ceiling(seq_along(vec1)/5))){
      result <- i * sample(vec2)
      vec3 <- c(vec3, result)
    }
    
    vec3
    #  [1]  1.02  0.99  0.98  1.00  1.01  2.04  2.02  1.98  2.00  1.96  3.03  2.97  3.00
    # [14]  2.94  3.06  4.04  3.92  3.96  4.00  4.08  5.10  5.05  5.00  4.95  4.90  5.88
    # [27]  5.94  6.06  6.12  6.00  7.14  6.93  7.00  6.86  7.07  7.92  7.84  8.08  8.00
    # [40]  8.16  9.00  9.09  8.82  8.91  9.18  9.80 10.20 10.10 10.00  9.90  1.02  1.00
    # [53]  1.01  0.98  0.99  1.96  2.00  1.98  2.04  2.02  2.94  3.00  3.06  2.97  3.03
    # [66]  3.96  4.08  3.92  4.04  4.00  5.10  4.90  4.95  5.05  5.00  6.00  6.12  5.88
    # [79]  6.06  5.94  7.14  7.07  7.00  6.86  6.93  7.84  8.16  7.92  8.00  8.08  9.09
    # [92]  9.18  8.82  9.00  8.91 10.10  9.80 10.20  9.90 10.00
    
    mean(c(vec3[1:5]))
    [1] 1
    mean(c(vec3[6:10]))
    [1] 2
    

    【讨论】:

    • 非常感谢,我也喜欢你的方法
    【解决方案2】:

    有点晚了,但这里的函数是通过 a、b、... 向量化的

    runifMean <- function(n, length, xmin, xmax){
      m <- matrix(0, nrow = n, ncol = length)
      m[, 1] <- runif(n, -1, 1)
      summ <- m[, 1]
      
      for(i in 2:(length - 1)){
        m[, i] <- -runif(n)*sign(summ)
        summ <- summ + m[, i]
      }
      
      m[, length] <- -summ
      return(m*(xmax - xmin)/2 + (xmax + xmin)/2)
    }
    

    它返回一个包含n 行和length 列的矩阵。每行都有介于xminxmax 之间的随机值,平均值为(xmax - xmin)/2

    set.seed(123)
    v <- rep(runif(4), each = 5) # original vector
    vR <- v*as.vector(t(runifMean(4, 5, 0.99, 1.01))) # with random perturbations
    # check that the means from vR equal the original values from v
    rowMeans(matrix(vR, nrow = 4, byrow = TRUE)) == v[seq(by = 5, length.out = 4)]
    [1] TRUE TRUE TRUE TRUE
    

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      相关资源
      最近更新 更多