【发布时间】: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 中最快、最有效的方法是什么?
【问题讨论】:
我有两个向量可以写成如下:
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 中最快、最有效的方法是什么?
【问题讨论】:
我们可以做
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
【讨论】:
这对于这项任务来说可能太多了。至少对我来说更容易理解:
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
【讨论】: