我有以下简单的向量:
a = c(1,0,0,1,0,0,0,0)
和我想获得一个向量(b),这样对于a中的每个指标x,如果a[x]是1,我们让它保持原样,如果它是0,我们计算a[x-1] + 1,直到下一个1:
b = c(1,2,3,1,2,3,4,5)
我尝试使用map():
map(
.x = seq(1,(length(a))),
.f = function(x) {
a[x] = ifelse(a[x]==1, a[x], a[x-1]+1)
a})
显然这不起作用,因为map不更新a向量。我如何使用map()做到这一点。是否有可能在map()之外更新某个东西?
如果您只是将其更改为使用叠加赋值操作符<<-
,那么您尝试的方法实际上是有效的。
a = c(1,0,0,1,0,0,0,0)
map(
.x = seq(1,(length(a))),
.f = function(x) {
a[x] <<- ifelse(a[x]==1, a[x], a[x-1]+1)
a})
a
#> [1] 1 2 3 1 2 3 4 5
也许一个解决方案接近你正在寻找的(即模仿for loop
)是purrr::accumulate
。
accumulate(1:8, .f = ~ ifelse(a[.y] == 1, 1, .x + 1))
#[1] 1 2 3 1 2 3 4 5