如果在小标题中找不到值,请提供NA R

时间:2018-12-06 17:38:56

标签: r purrr

我有以下问题。我有小标题的列表列,我想通过仅获取某些值并从中创建新小标题来进行清理。问题在于,并非所有列均以原始标题显示,因此我想将其替换为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的{​​{1}}函数来创建干净的列。

mutate

预期结果,但是如何解决这个问题,并在第二个小标题中用NA替换val2并返回值呢?

我认为这可以解决问题

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'. 

但这也会失败。

1 个答案:

答案 0 :(得分:0)

这是一个很好的技巧:

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填充空的列。