代码之家  ›  专栏  ›  技术社区  ›  Hakki

如果在TIBLE中找不到值,则给出NA R

  •  2
  • Hakki  · 技术社区  · 7 年前

    我有以下问题。我有一个tibble列表列,我想通过获取某些值并从中创建新的tibble来清理它。问题是并不是所有的列都可以在原来的tibble中使用,所以我想用NA替换它们。这个例子将澄清这一点。

    tbl <- tibble(list_col = list(tibble(id = c("A", "B", "C"),
                                        val1 = c(1, 2, 3),
                                        val2 = c(11, 22, 33)),
                                 tibble(id = c("A", "B", "C"),
                                        val1 = c(1, 2, 3))))
    

    实际数据更复杂,但这足以说明问题所在。我创建了一个函数来选择我想要的列。我现在用几天的时间把一切都包起来 possibly 为了避免落空。

    get_res <- possibly(function(ls){
      out = tibble(id = ls$id,
                   val1 = ls$val1,
                   val2 = ls$val2)
      return(out)
    }, otherwise = NA)
    

    那我通常 map mutate

    tbl %>% 
      mutate(clean = map(list_col, get_res))
    
    # A tibble: 2 x 2
      list_col         clean           
      <list>           <list>          
    1 <tibble [3 x 3]> <tibble [3 x 3]>
    2 <tibble [3 x 2]> <lgl [1]>       
    Warning message:
    Unknown or uninitialised column: 'val2'. 
    

    预期的结果,但我怎样才能绕过这个问题,在第二个tibble中用NA替换val2,并返回我在那里得到的值呢?

    get_res2 <- possibly(function(ls){
      out = tibble(id = ls$id,
                   val1 = ls$val1,
                   val2 = tryCatch(ls$val2, error=function(e) NA))
      return(out)
    }, otherwise = NA)
    

    但这也将失败。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Julius Vainora    7 年前

    这里有一个很好的技巧:

    tbl %>% 
      mutate(clean = map(list_col, bind_rows,
                         tibble(id = character(), val1 = double(), val2 = double())))
    # A tibble: 2 x 2
    #   list_col         clean           
    #   <list>           <list>          
    # 1 <tibble [3 × 3]> <tibble [3 × 3]>
    # 2 <tibble [3 × 2]> <tibble [3 × 3]>
    

    利用您预先知道列是什么的事实+创建一个空 tibble + bind_rows NA