R:如何在保留嵌套嵌套小语的同时保留名称?

时间:2018-11-29 08:04:14

标签: r dplyr tidyr names unnest

此刻,我正试图弄清如何在嵌套时将内部列表和其他列表的名称嵌套在小标题内。

.id函数的unnest参数是我找到的最接近的参数,但是它开始对值进行编号,而不是使用给定的名称。

以下是我对最后修改的想法的MWE:

library(dplyr)
library(tidyr)

df.1 <- tibble(
  x = list("Foo","Bar"),
  y = list(
    list(a = list(aa = 1, ab = 2), b = list(ba = 6, bb = 22)),
    list(c = list(ca = 561, cb = 35), d = list(da = 346, db = 17))
  )
)

df.2 <- unnest(df.1, .id = "name.outher")
df.3 <- unnest(df.2, .id = "name.inner")

# How do I get from this:
#
#-----------------------------------------------------------------------
#  x  |                              y                                 |
#-----+----------------------------------------------------------------+
# Foo | list(a = list(aa = 1, ab = 2), b = list(ba = 6, bb = 22))      |
#-----+----------------------------------------------------------------+
# Bar | list(c = list(ca = 561, cb = 35), d = list(da = 346, db = 17)) |
#-----------------------------------------------------------------------
#
# to this:
#
#---------------------------------------
#  x  | name.outher | y   | name.inner |
#-----+-------------+-----+------------+
# Foo |      a      | 1   |     aa     |
#-----+-------------+-----+------------+
# Foo |      a      | 2   |     ab     |
#-----+-------------+-----+------------+
# Foo |      b      | 6   |     ba     |
#-----+-------------+-----+------------+
# Foo |      b      | 22  |     bb     |
#-----+-------------+-----+------------+
# Bar |      c      | 561 |     ca     |
#-----+-------------+-----+------------+
# Bar |      c      | 35  |     cb     |
#-----+-------------+-----+------------+
# Bar |      d      | 346 |     da     |
#-----+-------------+-----+------------+
# Bar |      d      | 17  |     db     |
#-------------------------------------
# 
# instead of this:
#
#---------------------------------------
#  x  | name.outher | y   | name.inner |
#-----+-------------+-----+------------+
# Foo |      1      | 1   |     1      |
#-----+-------------+-----+------------+
# Foo |      1      | 2   |     1      |
#-----+-------------+-----+------------+
# Foo |      1      | 6   |     2      |
#-----+-------------+-----+------------+
# Foo |      1      | 22  |     2      |
#-----+-------------+-----+------------+
# Bar |      2      | 561 |     3      |
#-----+-------------+-----+------------+
# Bar |      2      | 35  |     3      |
#-----+-------------+-----+------------+
# Bar |      2      | 346 |     4      |
#-----+-------------+-----+------------+
# Bar |      2      | 17  |     4      |
#---------------------------------------

您是否知道在取消嵌套此数据结构的同时如何保留名称?

1 个答案:

答案 0 :(得分:0)

我们可以melt

library(reshape2)
library(dplyr)
df.1 %>% 
   .$y %>% 
   melt %>%
   select(x = L1, name.outher = L2, y = value, name.inner = L3)
#  x name.outher   y name.inner
#1 1           a   1         aa
#2 1           a   2         ab
#3 1           b   6         ba
#4 1           b  22         bb
#5 2           c 561         ca
#6 2           c  35         cb
#7 2           d 346         da
#8 2           d  17         db

或使用mapas_tibble

library(tidyverse)
df.1 %>%
   pull(y) %>% 
   map_df(~ as_tibble(.x) %>%
                map_df(~as_tibble(.x) %>%
                    gather(name.inner, y), .id = 'name.outer'),
     .id = 'x')
# A tibble: 8 x 4
#  x     name.outer name.inner     y
#  <chr> <chr>      <chr>      <dbl>
#1 1     a          aa             1
#2 1     a          ab             2
#3 1     b          ba             6
#4 1     b          bb            22
#5 2     c          ca           561
#6 2     c          cb            35
#7 2     d          da           346
#8 2     d          db            17