从一列数据框中提取数据框(tidyverse方法)

时间:2018-02-05 13:32:54

标签: r dplyr purrr

我已经能够使用purrr做一些很好的事情,以便能够处理数据帧中的dataframe列。我指的是数据帧的一列,其中每个单元格都包含一个数据帧。

我试图找出用于提取其中一个数据帧的惯用方法。

示例

# Create a couple of dataframes:
df1 <- tibble::tribble(~a, ~b,
                        1,  2,
                        3,  4)
df2 <- tibble::tribble(~a, ~b,
                       11, 12,
                       13, 14)

# Make a dataframe with a dataframe column containing 
# our first two dfs as cells:
meta_df <- tibble::tribble(~df_name, ~dfs, 
                           "One",     df1, 
                           "Two",     df2)

我的问题是,从meta_df中取出其中一个数据帧的tidyverse首选方法是什么?假设我使用select()filter()获取了我想要的单元格:

library("magrittr")
# This returns a 1x1 tibble with the only cell containing the 2x2 tibble that
# I'm actually after:
meta_df %>%
  dplyr::filter(df_name == "Two") %>%
  dplyr::select(dfs)

这很有效,但似乎是非整齐的:

# To get the actual tibble that I'm after I can wrap the whole lot in brackets
# and then use position [[1, 1]] index to get it:
(meta_df %>%
  dplyr::filter(df_name == "Two") %>%
  dplyr::select(dfs))[[1, 1]]

# Or a pipeable version:
meta_df %>%
  dplyr::filter(df_name == "Two") %>%
  dplyr::select(dfs) %>%
  `[[`(1, 1)

我有一种感觉,这可能是答案在purrr而不是dplyr的情况,并且一旦你知道它就可能是一个简单的技巧,但我现在要来了到目前为止空白。

1 个答案:

答案 0 :(得分:2)

更好的解决方案:

使用tidyr::unnest()

meta_df %>%
  dplyr::filter(df_name == "Two") %>%
  dplyr::select(dfs) %>%
  tidyr::unnest()

其他解决方案:

您可以使用pull(以tidyverse方式选择列,相当于$),但它会返回一个元素的元素列表,因此您需要添加%>% .[[1]]到最后。

meta_df %>%
  dplyr::filter(df_name == "Two") %>%
  dplyr::pull(dfs) %>% .[[1]]