我有以下问题。我有小标题的列表列,我想通过仅获取某些值并从中创建新小标题来进行清理。问题在于,并非所有列均以原始标题显示,因此我想将其替换为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'.
但这也会失败。
答案 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
填充空的列。