【问题标题】:modifying a subset of all vectors in a list (without loop)修改列表中所有向量的子集(无循环)
【发布时间】:2018-02-01 10:32:55
【问题描述】:

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

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

我认为这可以通过在循环中遍历向量来解决,但我想知道是否有更好的方法来解决这个问题。

【问题讨论】:

    标签: r list na


    【解决方案1】:

    如果我们对不循环感兴趣,那么 unlist list 元素,一次性完成 replacement 和 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-02
        • 2021-12-05
        • 1970-01-01
        • 2020-11-06
        • 2011-09-11
        • 2021-11-29
        • 2021-11-26
        • 2018-05-15
        相关资源
        最近更新 更多