【问题标题】:R: How to keep names while unnesting doubled nested tibble?R:如何在取消嵌套双重嵌套的小标题时保留名称?
【发布时间】:2019-05-01 05:45:37
【问题描述】:

目前,我正在尝试弄清楚如何在取消嵌套时将内部列表和其他列表的名称保持在 tibble 中。

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

这是一个 MWE 与我对最终 tibble 的想法:

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      |
#---------------------------------------

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

【问题讨论】:

    标签: r dplyr tidyr names unnest


    【解决方案1】:

    我们可以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
    

    【讨论】:

    • 这个很接近(谢谢),但是第一列(标记为“x”)丢失了,可以添加吗?
    • @Someone2 抱歉,我删除了 select 中的那一列。固定
    • 很抱歉再次打扰您,但我发现了一个问题:我稍微编辑了我的 MWE,因此“x”从 3 变为 4,现在“x”列不再起作用。你知道怎么解决吗?
    • @Someone2 或df.1 %&gt;% .$y %&gt;% melt %&gt;% mutate(L1 = df.1$x[L1]) %&gt;% select(x = L1, name.outher = L2, y = value, name.inner = L3)
    • 反正我更喜欢变异一个。请注意,使用 mutate 时,您的 x 将成为元素列表。使用 ... %&gt;% mutate(L1 = unlist(df.1$x[L1])) %&gt;% ... 会忽略这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2021-12-05
    • 2012-08-05
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多