【问题标题】:Merging 2 Vectors to 1 Vector that satisfies certain criteria将 2 个向量合并为 1 个满足特定条件的向量
【发布时间】:2021-12-06 14:54:29
【问题描述】:

我有两个向量可以写成如下:

aa <- c(0, 0, 0, 0, 1, 0, 0, 0)
bb <- c(0, 2, 0, 0, 3, 1, 1, 1)

我想合并这些向量,以便当向量 aa 干扰值 1 时向量 bb 的其余部分取值为零。在此示例中,结果应如下所示:

cc <- c(0, 2, 0, 0, 3, 0, 0, 0) 

在 R 中最快、最有效的方法是什么?

【问题讨论】:

    标签: r vector


    【解决方案1】:

    我们可以做

    library(dplyr)
    ifelse(lag(cummax(aa), default = 0) == 0, bb, aa)
    [1] 0 2 0 0 3 0 0 0
    

    或者另一种方式是

    bb * !c(0, head(cummax(aa), -1))
    [1] 0 2 0 0 3 0 0 0
    

    或者其他选项

    ind <- (which.max(aa) + 1):length(aa)
    bb[ind] <- aa[ind]
    > bb
    [1] 0 2 0 0 3 0 0 0
    

    【讨论】:

      【解决方案2】:

      这对于这项任务来说可能太多了。至少对我来说更容易理解:

      library(dplyr)
      cc <- tibble(aa,bb) %>% 
        group_by(id_group=lag(cumsum(aa==1), default = 0)) %>% 
        mutate(cc = ifelse(id_group == 0, coalesce(bb,aa), coalesce(aa,bb))) %>% 
        pull(cc)
      

      输出:

      [1] 0 2 0 0 3 0 0 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 2018-11-03
        • 1970-01-01
        • 2018-02-02
        • 1970-01-01
        • 1970-01-01
        • 2023-02-22
        相关资源
        最近更新 更多