我有以下问题。我有一个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)
但这也将失败。