如何解决如何使用循环遍历所有包含列表的列的unnest_wider?
我有以下数据
A B C D
1 1501583974 <list [3]> <tibble>
1 1501616585 <list [3]> <tibble>
1 1501583344 <list [3]> <tibble>
1 1501573386 <list [3]> <tibble>
我使用的代码
data %>%
unnest_wider(c,names_sep="_") %>%
unnest_wider(d,names_sep="_")
提供输出
A B C_1 C_2 C_3 D_1 D_2
1 1501583974 1 2 3 <list [1]> <list [1]>
1 1501616585 1 2 3 <list [1]> <list [1]>
1 1501583344 1 2 3 <list [1]> <list [1]>
1 1501573386 1 2 3 <list [1]> <list [1]>
,然后在所有列上再次执行unnest_wider()十分繁琐。
如何设计一个循环,直到所有带有列表的列都未嵌套为止?
谢谢
解决方法
这是一个带有嵌套列表和数据框列的数据框。
library(tidyverse)
l <- list(y1 = 1,y2 = list(z1 = 1))
data <- tribble(
~x1,~list1,~tibble1,1,l,as.tibble(l),as.tibble(l)
)
data
#> # A tibble: 4 x 3
#> x1 list1 tibble1
#> <dbl> <list> <list>
#> 1 1 <named list [2]> <tibble [1 × 2]>
#> 2 1 <named list [2]> <tibble [1 × 2]>
#> 3 1 <named list [2]> <tibble [1 × 2]>
#> 4 1 <named list [2]> <tibble [1 × 2]>
我们可以创建一个函数unnest_all
,该函数递归取消嵌套所有列表列。
- 首先,它找到所有列表列。
- 然后,如果有任何列表 列,但不会嵌套它们。
- 最后,它再次调用
unnest_all
取消嵌套所有剩余的列表列。
unnest_all <- function(df) {
list_columns <- df %>% keep(is.list) %>% names()
if (length(list_columns) == 0) {
return(df)
}
for (list_column in list_columns) {
df <-
df %>%
unnest_wider(list_column,names_sep = "_")
}
unnest_all(df)
}
unnest_all(data)
#> # A tibble: 4 x 5
#> x1 list1_y1 list1_y2_z1 tibble1_y1 tibble1_y2_z1
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1 1 1
#> 2 1 1 1 1 1
#> 3 1 1 1 1 1
#> 4 1 1 1 1 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。