簡體   English   中英

修改列表中所有向量的子集(無循環)

[英]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

我認為這可以通過循環中的迭代迭代來解決,但我想知道是否有更好的方法來解決這個問題。

如果大家有興趣不循環,然后unlistlist元素,做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

一種可能的解決方案是使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM