我有一个深度嵌套的列表,我想将其转换为单个小标题。在顶层有一些二级列表。其中每一个的长度都相同。每一个里面都有一个三级列表。其中每个都包含一个值和一个标识符。
我想要做的是创建一个小标题,其中的列由第三级列表标识符命名,并且每个第三级列表中的单个值作为观察值填充到该列中。
我已经尝试了很多与此类似的调整,但我还不太熟悉这些功能,而且我不确定如何让它发挥作用。
# 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)
这里没有什么“漂亮”的东西......
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
您可以使用以下方法完成相同的任务:
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