【问题标题】:Use filter() (and other dplyr functions) inside nested data frames with map()在带有 map() 的嵌套数据框中使用 filter() (和其他 dplyr 函数)
【发布时间】:2018-04-20 08:27:24
【问题描述】:

我正在尝试使用map()purrr 包将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()

谢谢!

【问题讨论】:

    标签: r dplyr tidyverse purrr


    【解决方案1】:

    您可以使用map(full, ~ filter(., c &gt;= 95)),其中. 代表单个嵌套tibble,您可以直接对其应用过滤器

    df_nested_2 <- df_full_nested %>% mutate(filtered = map(full, ~ filter(., c >= 95)))
    
    identical(df_nested, df_nested_2)
    # [1] TRUE
    

    【讨论】:

    • 哇!答案似乎比我的任何尝试都简单!我在哪里可以阅读语法?我知道~ 指定“一个函数”,但是每次我必须使用. 时我都会感到困惑,这就是为什么我的尝试都搞砸了——我不知道如何以及在哪里放置~.,这表明我缺乏理解。
    • 您可以在?map 阅读语法,它对参数符号进行了非常全面的解释。例如,在.f 下,它说对于单参数函数,使用.。对于有两个参数的函数,请使用 .x.y
    • 对于可能会发现此内容并正在寻找文档的谷歌用户,many models chapter in R for Data Science 是有关此信息的重要来源
    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多