修改列表中所有向量的子集(无循环)
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
个元素,一次性完成 replace
和 relist
它
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
我知道我可以像这样修改向量的子集:
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
个元素,一次性完成 replace
和 relist
它
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