简洁版
使用 unnest_cross()
函数(如果列表列缺失数据,则需要小心使用 keep_empty = TRUE
参数):
unnest_cross <- function(data, cols, ...) {
.df_out <- data
.cols <- tidyselect::eval_select(rlang::enquo(cols), data)
purrr::walk(
.cols,
function(col) {
.df_out <<- unnest(.df_out, {{ col }}, ...)
}
)
.df_out
}
背景:使用unnest()
处理多个列表列
unnest()
从v0.3.0
(2015年)开始支持多个列。它当前使用cols
参数,该参数接受典型的tidyverse选择方法。
注意:它专门设计用于反转nest()
数据框,并要求列表列为“兼容尺寸的并行条目”。这意味着:
- 它不适用于原始数据框。
df <- structure(list(
a = list(c("a", "b"), "c"),
b = list(c("1", "2", "3"), "3"),
c = c(11, 22)),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -2L))
tidyr::unnest(df, cols = tidyselect::everything())
- 它不会产生与顺序列表列
unnest()
相同的输出(例如笛卡尔积)。
df_parallel <- structure(list(
a = list(c("a", "b", "c"), "c"),
b = list(c("1", "2", "3"), "3"),
c = c(11, 22)),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -2L))
tidyr::unnest(df_parallel, cols = tidyselect::everything())
unnest_cross()
详细信息
unnest_cross()
使用 purrr::walk()
循环遍历指定的列,并通过超级赋值(使用 <<-
)每次将结果保存下来。它的名称源于与 purrr::cross()
的相似性,因为它总是在数据框中生成列表列的笛卡尔积,即使它们是“平行条目”和/或“兼容大小”。
- 对于原始数据框(具有不同长度的列表列),它可以按预期工作:
unnest_cross(df, cols = tidyselect::everything())
- 它创建了
df_parallel
的笛卡尔积,这与unnest()
非常不同。
unnest_cross(df_parallel, cols = tidyselect::everything())
本文创建于2022年6月3日,使用reprex软件包(v2.0.1)
这是一段关于IT技术的内容。