【问题标题】:Replace elements of vector by vector用向量替换向量的元素
【发布时间】:2016-08-16 01:56:14
【问题描述】:

我想用整个第二个向量替换向量的几个元素。条件是,第一个向量的替换元素等于第三个向量。这是一个例子:

 a <- 1:10
 b <- 5:7
 v <- rnorm(2, mean = 1, sd = 5)

我的输出应该是

 c(a[1:4], v, a[8:10])

我已经试过了

 replace(a, a == b, v)
 a[a == b] <- v

但取得了一点成功。有人可以帮忙吗?

【问题讨论】:

    标签: r vector replace


    【解决方案1】:

    == 运算符最适合用于匹配长度相同的向量,或者当向量之一的长度仅为 1 时。

    试试这个,注意在这两种情况下你都得不到你想要的位置匹配。

    > a == b
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    Warning message:
    In a == b : longer object length is not a multiple of shorter object length
    > b == a
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    Warning message:
    In b == a : longer object length is not a multiple of shorter object length
    

    改为使用match() - 这将为您提供值匹配的索引位置。

    > match(b, a)
    [1] 5 6 7
    

    然后:

    a <- 1:10
    b <- 5:7
    v <- rnorm(3, mean=1, sd=5)
    
    a[match(b, a)] <- v
    

    结果:

    a
     [1]  1.0000000  2.0000000  3.0000000  4.0000000 -4.6843669  0.9014578 -0.7601413  8.0000000
     [9]  9.0000000 10.0000000
    

    【讨论】:

      【解决方案2】:

      这里'另一个选项:

      a[a %in% b] <- v
      

      由于在 OP 中描述的示例中,向量 a 和 b 中有三个公共数字,而 v &lt;- rnorm(2, mean = 1, sd = 5) 仅包含 2 个数字,向量 v 将被回收并发出警告。

      可以防止警告和回收,例如,通过将v 定义为

      v <- rnorm(sum(a %in% b), mean = 1, sd = 5)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 2017-02-27
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        相关资源
        最近更新 更多