从多级嵌套列表构建 tibble?

问题描述 投票:0回答:2

我有一个深度嵌套的列表,我想将其转换为单个小标题。在顶层有一些二级列表。其中每一个的长度都相同。每一个里面都有一个三级列表。其中每个都包含一个值和一个标识符。

我想要做的是创建一个小标题,其中的列由第三级列表标识符命名,并且每个第三级列表中的单个值作为观察值填充到该列中。

我已经尝试了很多与此类似的调整,但我还不太熟悉这些功能,而且我不确定如何让它发挥作用。

  # Convert to tibble
  temp <- map_dfr(lstTemp, ~tibble::tibble(!!pluck(., "identifiers") := pluck(., "values")))

这里有一些代码可以生成像我一样的列表结构。

set.seed(123)  # Setting seed for reproducibility

# Create a nested list structure
nested_list <- replicate(5, {
  lapply(1:14, function(counter) {
    list(
      identifiers = letters[counter],
      values = runif(1, 1, 10)
    )
  })
}, simplify = FALSE)
r nested-lists tibble
2个回答
0
投票

这里没有什么“漂亮”的东西......

library(dplyr)
bind_rows(
  lapply(nested_list, function(L1) 
    bind_cols(lapply(L1, function(L2) setNames(tibble(L2$values), L2$identifiers))))
)
# # A tibble: 5 × 14
#       a     b     c     d     e     f     g     h     i     j     k     l     m     n
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1  3.59  8.09  4.68  8.95  9.46  1.41  5.75  9.03  5.96  5.11  9.61  5.08  7.10  6.15
# 2  1.93  9.10  3.21  1.38  3.95  9.59  9.01  7.24  6.76  9.95  6.90  7.38  5.90  6.35
# 3  3.60  2.32  9.67  9.12  7.22  8.16  1.22  5.30  7.83  2.95  3.86  3.08  2.29  4.73
# 4  4.72  4.32  2.37  2.25  3.10  5.19  3.39  8.72  1.41  4.98  8.19  2.10  6.05  2.86
# 5  2.15  7.78  9.06  4.37  6.99  1.85  4.46  3.47  8.33  5.04  8.29  8.31  8.15  4.96

0
投票

您可以使用以下方法完成相同的任务:

library(tidyverse)
map(nested_list, transpose) %>%
   array(length(.))%>%
   array2DF() %>%
   exec(pmap_df, ., ~set_names(unlist(..3), ..2))

# A tibble: 5 × 14
      a     b     c     d     e     f     g     h     i     j     k     l     m     n
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  3.59  8.09  4.68  8.95  9.46  1.41  5.75  9.03  5.96  5.11  9.61  5.08  7.10  6.15
2  1.93  9.10  3.21  1.38  3.95  9.59  9.01  7.24  6.76  9.95  6.90  7.38  5.90  6.35
3  3.60  2.32  9.67  9.12  7.22  8.16  1.22  5.30  7.83  2.95  3.86  3.08  2.29  4.73
4  4.72  4.32  2.37  2.25  3.10  5.19  3.39  8.72  1.41  4.98  8.19  2.10  6.05  2.86
5  2.15  7.78  9.06  4.37  6.99  1.85  4.46  3.47  8.33  5.04  8.29  8.31  8.15  4.96
© www.soinside.com 2019 - 2024. All rights reserved.