代码之家  ›  专栏  ›  技术社区  ›  Maël

替换嵌套tibble/dataframe中的值

  •  0
  • Maël  · 技术社区  · 4 年前

    我有一个tibbles中的tibbles:

    a = tibble(a = c(1:3))
    df <- tibble::tibble(a1 = list(a,a), a2 = list(NULL,a))
    
    # A tibble: 2 x 2
      a1               a2              
      <list>           <list>          
    1 <tibble [3 x 1]> <NULL>          
    2 <tibble [3 x 1]> <tibble [3 x 1]>
    

    我想更换 <NULL> 价值与另一个tibble,比方说 a 。

    但是

    df %>% tidyr::replace_na(list(a2 = a))
    

    给出这个

    # A tibble: 2 x 2
      a1               a2              
      <list>           <list>          
    1 <tibble [3 x 1]> <int [3]>       
    2 <tibble [3 x 1]> <tibble [3 x 1]>
    

    而我想要这个

    # A tibble: 2 x 2
      a1               a2              
      <list>           <list>          
    1 <tibble [3 x 1]> <tibble [3 x 1]>   
    2 <tibble [3 x 1]> <tibble [3 x 1]>
    

    有没有简单的解决方法?

    0 回复  |  直到 4 年前
        1
  •  1
  •   PaulS    4 年前

    另一种可能的解决方案:

    library(tidyverse)
    
    a = tibble(a = c(1:3))
    df <- tibble::tibble(a1 = list(a,a), a2 = list(NULL,a))
    
    df %>% 
      replace_na(list(a2 = list(a)))
    
    #> # A tibble: 2 × 2
    #>   a1               a2              
    #>   <list>           <list>          
    #> 1 <tibble [3 × 1]> <tibble [3 × 1]>
    #> 2 <tibble [3 × 1]> <tibble [3 × 1]>
    
        2
  •  1
  •   OzanStats    4 年前
    a <- tibble::tibble(a = 1:3)
    df <- tibble::tibble(a1 = list(a, a), a2 = list(NA, a))
    df[is.na(df)] <- list(a)
    df
    # # A tibble: 2 × 2
    #   a1               a2              
    #   <list>           <list>          
    # 1 <tibble [3 × 1]> <tibble [3 × 1]>
    # 2 <tibble [3 × 1]> <tibble [3 × 1]>
    

    OP修改问题时更新:

    library(dplyr)
    
    a <- tibble(a = 1:3)
    df <- tibble(a1 = list(a, a), a2 = list(NULL, a))
    df %>% replace(. == "NULL", list(a))
    # # A tibble: 2 × 2
    #   a1               a2              
    #   <list>           <list>          
    # 1 <tibble [3 × 1]> <tibble [3 × 1]>
    # 2 <tibble [3 × 1]> <tibble [3 × 1]>
    
        3
  •  1
  •   Joris C.    4 年前

    另一种(通用)解决方案,假设嵌套级别事先已知:

    library(purrr)
    
    map_depth(df, .depth = 2, .f = ~if(is.null(.x)) a else .x) %>% 
      as_tibble()
    
    #> # A tibble: 2 × 2
    #>   a1               a2              
    #>   <list>           <list>          
    #> 1 <tibble [3 × 1]> <tibble [3 × 1]>
    #> 2 <tibble [3 × 1]> <tibble [3 × 1]>
    

    对于任意级别的嵌套,我们也可以使用 rrapply() 在中 rrapply -pacakge:

    library(rrapply)
    
    rrapply(df, condition = is.null, f = function(x) a)
    
    #> # A tibble: 2 × 2
    #>   a1               a2              
    #>   <list>           <list>          
    #> 1 <tibble [3 × 1]> <tibble [3 × 1]>
    #> 2 <tibble [3 × 1]> <tibble [3 × 1]>