如何使用循环在包含列表的所有列上取消_wider()的测试?

如何使用循环在包含列表的所有列上取消_wider()的测试?,r,dplyr,tidyr,R,Dplyr,Tidyr,我有以下数据 A B C D 1 1501583974 <list [3]> <tibble> 1 1501616585 <list [3]> <tibble> 1 1501583344 <list [3]> <tibble> 1 1501573386 <list [3]> <tibble> 输出 A

我有以下数据

A   B            C             D
1   1501583974   <list [3]>  <tibble>
1   1501616585   <list [3]>  <tibble>
1   1501583344   <list [3]>  <tibble>
1   1501573386   <list [3]>  <tibble>
输出

    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]>
A B C_1 C_2 C_3 D_1 D_2
1   1501583974   1    2   3     
1   1501616585   1    2   3     
1   1501583344   1    2   3     
1   1501573386   1    2   3     
然后在所有列上再次取消最宽的() 如何设计一个循环,直到所有包含列表的列都没有被取消列表为止


谢谢

这是一个带有嵌套列表和数据框列的数据框

library(tidyverse)

l <- list(y1 = 1, y2 = list(z1 = 1))

data <- tribble(
  ~x1,  ~list1,     ~tibble1,
    1,       l, as.tibble(l),
    1,       l, as.tibble(l),
    1,       l, as.tibble(l),
    1,       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\u all(数据)
#>#A tibble:4 x 5
#>x1列表1_y1列表1_y2_z1 tibble1_y1 tibble1_y2_z1
#>                             
#> 1     1        1           1          1             1
#> 2     1        1           1          1             1
#> 3     1        1           1          1             1
#> 4     1        1           1          1             1

如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易为您提供帮助。请将
dput(数据)
添加到您的问题中。我遇到了以下错误-名称错误(x)您的数据集有无法取消的空列表。修改该函数以忽略空列表:
list\u列%keep(is.list)%%>%discard(~any(map\u lgl(,is\u empty)))%%>%names()
。我不知道您可以在其内部调用函数。我甚至不明白这是怎么回事。
library(tidyverse)

l <- list(y1 = 1, y2 = list(z1 = 1))

data <- tribble(
  ~x1,  ~list1,     ~tibble1,
    1,       l, as.tibble(l),
    1,       l, as.tibble(l),
    1,       l, as.tibble(l),
    1,       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 <- 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