如何使用循环在包含列表的所有列上取消_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