r - as_tibble 控制扁平化程度

标签 r dplyr tidyr purrr tibble

在下面的示例中,我有一个列表,其中一个元素是带有子列表的列表。看起来 as_tibble() 正在变平,直到列表的第三层才停止。如果能够控制展平,那就太好了,这样我就可以在示例的元素 "c" 中保留带有子列表的整个列表。我怀疑需要 map()flatten() 等的某种组合,但无法弄清楚。

问题已重现

as_tibble() 返回 2 行,但我实际上只想要 1 行,其中有一列对应于每个列表元素(“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

最佳答案

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

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

关于r - as_tibble 控制扁平化程度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49580772/

相关文章:

r - 在 tidyr 中使用 split 在一定数量的字符后分隔列?

r - geom_bar : color gradient and cross hatches (using gridSVG), 透明度问题

r - 在SE情况下如何使用nesting_

r - 使用 dbplyr 跨数据库连接

替换引用命名向量的整个字符串

r - 将 R 中的多个列组合成一个新的向量列(最好是 tidyr 解决方案)

r - 如果列包含 NA,如何对 data.frame 进行子集化

R,时间序列分解中的不完全元素

r - 如何使用依赖于数据框名称的条件过滤数据

删除列中项目的百分比