用位置列表中的索引替换向量元素

Replace vector elements with indexes from list of positions

我有一个值向量:

y=c(2,3,4,4,3,2,1,1)

以及位置向量列表:

l=list(c(1,2),c(2,3),c(3,4),c(4,5),c(5,6),c(6,7),c(7,8),c(8,1))

我想为列表 l.

中的每个元素用 NA(或其他)替换 y 的值

预期输出是一个长度为 length(l):

的列表
[[1]]
[1] NA NA  4  4  3  2  1  1

[[2]]
[1]  2 NA NA  4  3  2  1  1

[[3]]
[1]  2  3 NA NA  3  2  1  1

[[4]]
[1]  2  3  4 NA NA  2  1  1

[[5]]
[1]  2  3  4  4 NA NA  1  1

[[6]]
[1]  2  3  4  4  3 NA NA  1

[[7]]
[1]  2  3  4  4  3  2 NA NA

[[8]]
[1] NA  3  4  4  3  2  1 NA

首选 Base R 解决方案。

我们可以遍历 list,使用索引 replace 将 'y' 的值 NA

lapply(l, \(x) replace(y, x, NA))
[[1]]
[1] NA NA  4  4  3  2  1  1

[[2]]
[1]  2 NA NA  4  3  2  1  1

[[3]]
[1]  2  3 NA NA  3  2  1  1

[[4]]
[1]  2  3  4 NA NA  2  1  1

[[5]]
[1]  2  3  4  4 NA NA  1  1

[[6]]
[1]  2  3  4  4  3 NA NA  1

[[7]]
[1]  2  3  4  4  3  2 NA NA

[[8]]
[1] NA  3  4  4  3  2  1 NA

或者另一种选择是 is.na<-

lapply(l, `is.na<-`, x = y)
[[1]]
[1] NA NA  4  4  3  2  1  1

[[2]]
[1]  2 NA NA  4  3  2  1  1

[[3]]
[1]  2  3 NA NA  3  2  1  1

[[4]]
[1]  2  3  4 NA NA  2  1  1

[[5]]
[1]  2  3  4  4 NA NA  1  1

[[6]]
[1]  2  3  4  4  3 NA NA  1

[[7]]
[1]  2  3  4  4  3  2 NA NA

[[8]]
[1] NA  3  4  4  3  2  1 NA

这是 lapply 的基础 R 解决方案。

lapply(l, \(x) {is.na(y) <- x; y})
#[[1]]
#[1] NA NA  4  4  3  2  1  1
#
#[[2]]
#[1]  2 NA NA  4  3  2  1  1
#
#[[3]]
#[1]  2  3 NA NA  3  2  1  1
#
#[[4]]
#[1]  2  3  4 NA NA  2  1  1
#
#[[5]]
#[1]  2  3  4  4 NA NA  1  1
#
#[[6]]
#[1]  2  3  4  4  3 NA NA  1
#
#[[7]]
#[1]  2  3  4  4  3  2 NA NA
#
#[[8]]
#[1] NA  3  4  4  3  2  1 NA