修改列表中所有向量的子集(无循环)

modifying a subset of all vectors in a list (without loop)

我知道我可以像这样修改向量的子集:

v1 = c(3, NaN, 5)
v1[is.nan(v1)] = 0 # change NaN values to 0

现在,是否可以像下面那样对列表的所有向量执行此操作,而不必循环到每个元素?

lst1 <- list('v1'=c(1,NaN,3), 'v2'=c(3,2,NaN), 'v3'=c(NaN,1,3))

类似于:

lst1[[*]][is.nan(lst1[[*]])] = 0

我认为这可以简单地通过在循环中迭代 vector 来解决,但我想知道是否有更好的方法来解决这个问题。

一种可能的解决方案是使用 lapply。它基本上遍历向量,但比使用 for 循环稍微好一点。

lapply(lst1, function(x) {x[is.na(x)]<-0;x})

输出:

$v1
[1] 1 0 3

$v2
[1] 3 2 0

$v3
[1] 0 1 3

如果我们对不循环感兴趣,那么 unlist list 个元素,一次性完成 replacerelist

v1 <- unlist(lst1)
relist(replace(v1, is.nan(v1), 0), skeleton = lst1)
#$v1
#[1] 1 0 3

#$v2
#[1] 3 2 0

#$v3
#[1] 0 1 3