使用filter()(以及其他dplyr函数)在map()内部嵌套数据框中。

15

我试图使用purrr包的map()方法将filter()函数应用于存储在嵌套数据框中的数据。

"为什么不先进行筛选,然后再嵌套?" - 你可能会问。 这样做也可以(我将展示使用此过程的预期结果),但我正在寻找使用purrr的方法。 我想要只有一个数据框,有两个列表列,都是嵌套数据框 - 一个完整的,一个被筛选的。

现在我可以通过两次执行nest()来实现:一次在所有数据上执行,第二次在筛选数据上执行:

library(tidyverse)

df <- tibble(
  a = sample(x = rep(c('x','y'),5), size = 10),
  b = sample(c(1:10)),
  c = sample(c(91:100))
)

df_full_nested <- df %>% 
  group_by(a) %>% 
  nest(.key = 'full')

df_filter_nested <- df %>%
  filter(c >= 95) %>%  ##this is the key step
  group_by(a) %>% 
  nest(.key = 'filtered')

## Desired outcome - one data frame with 2 nested list-columns: one full and one filtered.
## How to achieve this without breaking it out into 2 separate data frames?
df_nested <- df_full_nested %>% 
  left_join(df_filter_nested, by = 'a')

这些对象看起来像这样:

> df
# A tibble: 10 x 3
       a     b     c
   <chr> <int> <int>
 1     y     8    93
 2     x     9    94
 3     y    10    99
 4     x     5    97
 5     y     2   100
 6     y     3    95
 7     x     7    96
 8     y     6    92
 9     x     4    91
10     x     1    98

> df_full_nested
# A tibble: 2 x 2
      a             full
  <chr>           <list>
1     y <tibble [5 x 2]>
2     x <tibble [5 x 2]>

> df_filter_nested
# A tibble: 2 x 2
      a         filtered
  <chr>           <list>
1     y <tibble [3 x 2]>
2     x <tibble [3 x 2]>

> df_nested
# A tibble: 2 x 3
      a             full         filtered
  <chr>           <list>           <list>
1     y <tibble [5 x 2]> <tibble [4 x 2]>
2     x <tibble [5 x 2]> <tibble [4 x 2]>

所以,这个方法是有效的。但它并不够简洁。在实际应用中,我需要按照多个列进行分组,这意味着我也必须在多个列上进行连接...这会很快变得复杂。

我想知道是否有一种方法可以对嵌套列应用过滤器。这样,我就可以在同一个对象内操作。代码更加简洁易懂。

我认为它看起来会像这样

df_full_nested %>% mutate(filtered = map(full, ...))

但我不确定如何正确地映射filter()

谢谢!

1个回答

21
你可以使用 map(full, ~ filter(., c >= 95)),其中.表示单个嵌套的tibble,你可以直接应用filter来筛选:
df_nested_2 <- df_full_nested %>% mutate(filtered = map(full, ~ filter(., c >= 95)))

identical(df_nested, df_nested_2)
# [1] TRUE

1
哇!答案似乎比我尝试的任何方法都要简单得多! 我在哪里可以阅读语法?我知道~代表“函数”,但每次我必须使用.时,我就会感到困惑。这就是为什么我的尝试都搞砸了 - 我无法弄清楚在哪里放置~.,这表明我缺乏理解。 - Taraas
1
你可以在?map中阅读语法,它对参数符号有一个相当全面的解释。例如,在.f下面,它说*对于单参数函数,请使用.。对于两个参数函数,请使用.x.y*。 - Psidom
2
对于可能找到这篇文章并正在寻找文档的谷歌员工,关于此事的信息的一个很好的来源是《R数据科学》中的多模型章节 - lost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接