分享
三行代码  ›  专栏  ›  技术社区  ›  Logos

作用于列表参数的函数

  •  1
  • Logos  · 技术社区  · 7 月前

    A <- data.frame(x = c(1,2,3), y = c(4,5,6))
    B <- data.frame(x = c(7,8), y = c(1,2))
    Lst <- list(A, B) 
    names(Lst) <- c('A','B')
    idx <- c('A', 'B')
    
    Lst[['A']]['name'] <- 'A' 
    Lst[['B']]['name'] <- 'B' 
    

    我得到输出

    > Lst
    $A
      x y name
    1 1 4    A
    2 2 5    A
    3 3 6    A
    
    $B
      x y name
    1 7 1    B
    2 8 2    B
    

    按预期和要求。我想使用一个函数,而不是,为了使结果更通用,对于进一步的应用程序,使用以下代码:

    bad.lst <- mapply(function(lst,x) {
      lst[[x]]['name'] <- x
      return(lst)
    }, Lst, idx)
    

    结果出人意料

      A           B          
    x Numeric,3   Numeric,2  
    y Numeric,3   Numeric,2  
    A Character,3 Character,2
    

    1 回复  |  直到 7 月前
        1
  •  2
  •   akrun    7 月前

    我们可以利用 Map

    Lst1 <- Map(cbind, Lst, name = names(Lst))
    

    mapply 可以返回矩阵,因为默认情况下它使用 SIMPLIFY = TRUE

    mapply(cbind, Lst, name = names(Lst))
    #     A         B        
    #x    Numeric,3 Numeric,2
    #y    Numeric,3 Numeric,2
    #name factor,3  factor,2 
    

    SIMPLIFY = FALSE

    mapply(cbind, Lst, name = names(Lst), SIMPLIFY = FALSE)
    #$A
    #  x y name
    #1 1 4    A
    #2 2 5    A
    #3 3 6    A
    
    #$B
    #  x y name
    #1 7 1    B
    #2 8 2    B