【问题标题】:for-loop:The entries in vector A are to be replaced by the entries in vector Bfor-loop:向量 A 中的条目将被向量 B 中的条目替换
【发布时间】:2019-08-30 11:34:20
【问题描述】:

我将问题简化为一个小例子。我希望它对您有所帮助且易于理解。

给定两个向量 A 和 B。向量 A 中的条目将被向量 B 中的条目替换。替换应该以条目的绝对最小差异来完成。替换向量 A 中的所有条目后,应保存新向量。 也许 for 循环是个好主意?(也适用于大向量?) 非常感谢您的帮助!

例如:

A <- c(1.2, 1.3, 1.3, 1.4, 1.5) 

B <- c(1.25, 1.45)

for-loop 应该像这样工作:

1.2 - 1.25 = 0.05

1.2 - 1.45 = 0.25

等等

0.05 是绝对最小值,将1.2 替换为1.25

新向量应该如下所示:

newVector <- c(1.25, 1.25, 1.25, 1.45, 1.45)

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    另一个使用outermax.col的想法

    B[max.col(-abs(outer(A, B, `-`)))]
    # [1] 1.25 1.25 1.25 1.45 1.45
    

    如果AB 不太大,应该可以使用。

    一步一步

    outer(A, B, "-") 返回以下矩阵

    #      [,1]  [,2]
    #[1,] -0.05 -0.25
    #[2,]  0.05 -0.15
    #[3,]  0.05 -0.15
    #[4,]  0.15 -0.05
    #[5,]  0.25  0.05 
    

    其中第一列是A - B[1] 的结果,第二列是A - B[2]。对于每一行,我们需要找到绝对最小值的列位置。

    没有min.col 函数,因此在

    max.col(-abs(outer(A, B, `-`)))
    

    返回

    # [1] 1 1 1 2 2
    

    我们最终使用这个向量从B 中提取所需的值。

    【讨论】:

    • 感谢您的详细解释!
    【解决方案2】:

    首先得到AB的所有元素之差的最小值的索引:

    (ind <- sapply(A, function(a) which.min(abs(B - a))))
    # [1] 1 1 1 2 2
    

    然后将值替换为B中的相应值:

    B[ind]
    # [1] 1.25 1.25 1.25 1.45 1.45
    

    此表格用于说明目的。短代码直接是这样的:

    sapply(A, function(a) B[which.min(abs(B - a))])
    # [1] 1.25 1.25 1.25 1.45 1.45
    

    【讨论】:

      【解决方案3】:

      使用sapply,无需for-loop 即可轻松完成:

      newVector <- sapply(A,function(x) B[which.min(abs(x-B))])
      

      【讨论】:

      • 为了完整起见,当然我们一般不会避免 for 循环,但我们在 C 级别上使用 for 循环,这应该比R for 循环:GitHub
      • 是的,如果你对那个 thotal 的看法是正确的,那么在某个地方需要一个 for 循环。但除了(现在通常只是轻微的)速度提高之外,使用apply 系列会迫使您坚持R-paradigmas,我认为这对正在学习语言的人特别有用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2018-03-29
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多