as_tibble控制展平水平

时间:2018-03-30 20:07:14

标签: r dplyr tidyr purrr tibble

在下面的例子中,我有一个列表,其中一个元素是一个带有子列表的列表。似乎as_tibble()在停止前向下排列到第3级列表。很高兴能够控制展平,这样我就可以在示例的元素"c"中使用子列表保留整个列表。我怀疑需要map()flatten()等的某种组合,但无法弄明白。

问题转载

as_tibble()返回2行,但我真的只想要一行,其中一列对应于每个列表元素(" a"," b"," C"。)

library(dplyr)
x <- list(a = 1, 
          b = 2, 
          c = list(x=list(y=3, 
                          z=4), 
                   xx=NULL))
parsed <- as_tibble(x)
parsed
#> # A tibble: 2 x 3
#>       a     b c         
#>   <dbl> <dbl> <list>    
#> 1    1.    2. <list [2]>
#> 2    1.    2. <NULL>

parsed[1,]$c
#> $x
#> $x$y
#> [1] 3
#> $x$z
#> [1] 4

parsed[2,]$c
#> $xx
#> NULL

我想要的行为,我只需要第一级

parsed <- as_tibble(x)
parsed
#> # A tibble: 1 x 3
#>       a     b c         
#>   <dbl> <dbl> <list>    
#> 1    1.    2. <list [2]>

parsed[1,]$c
#> $x
#> $x$y
#> [1] 3
#> $x$z
#> [1] 4
#> $xx
#> NULL

2 个答案:

答案 0 :(得分:2)

这不是优雅,但这是一种方法。

library(purrr)
x <- list(a = 1, 
          b = 2, 
          c = list(x=list(y=3, 
                          z=4), 
                   xx=NULL))

# define a function to preserve the list
unnest_one_level <- function(x){
  if(is.list(x)) list(x) else x
}

res <- x %>% map_dfr(unnest_one_level)
res
#> # A tibble: 1 x 3
#>       a     b c         
#>   <dbl> <dbl> <list>    
#> 1    1.    2. <list [2]>

res$c
#> [[1]]
#> [[1]]$x
#> [[1]]$x$y
#> [1] 3
#> 
#> [[1]]$x$z
#> [1] 4
#> 
#> [[1]]$xx
#> NULL

答案 1 :(得分:1)

as.tibble将重复每列回收每个列的值,直到它们都有共享的元素数。在这里,<HierarchicalDataTemplate ItemsSource="{Binding Value, Converter={StaticResource valConv}}" > a的长度为1,但b的长度为2.因此,您似乎真的希望将其视为长度列表,您只需要将其嵌入一个列表。我认为至少在这种情况下你会做你想做的事。

c