purrr在地图中使用未嵌套的值来过滤数据

时间:2019-01-29 16:38:59

标签: r purrr

我想尝试根据未嵌套的数据中的值过滤嵌套列中的数据。

require(purrr)
require(dplyr)

set.seed(314)

dat1 <- data.frame(id = 1:3, tres1 = 1:3*10, tres2 = 2:4*10)

dat2 <- data.frame(id = rep(1:3, each = 20),
                   var = rnorm(20, 20,5))

dat <- dat1 %>% inner_join(dat2 %>% nest(-id)) 

我尝试了这个(以及其他可能性)

dat %>%
  mutate(map(data, ~filter(var > tres1, var < tres2)))

我不知道该怎么解决。

> str(dat)
'data.frame':   3 obs. of  3 variables:
  $ id  : int  1 2 3
$ tres1: num  10 20 30
$ tres2: num  20 30 40
$ data:List of 3
..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  20 obs. of  1 variable:
  .. ..$ var: num  13.6 23.6 15.8 16.5 20.6 ...
..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  20 obs. of  1 variable:
  .. ..$ var: num  13.6 23.6 15.8 16.5 20.6 ...
..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  20 obs. of  1 variable:
  .. ..$ var: num  13.6 23.6 15.8 16.5 20.6 ...

1 个答案:

答案 0 :(得分:1)

如果我们需要使用多列,那么pmap会更好。请注意

library(tidyverse)
dat2 %>% 
   group_by(id) %>% 
   nest %>%
   inner_join(dat1) %>% 
   mutate(data = pmap(list(data, tres1, tres2), ~ 
              ..1 %>% 
                  filter(var > ..2, var < ..3)))
# A tibble: 3 x 4
#     id data              tres1 tres2
#  <int> <list>            <dbl> <dbl>
#1     1 <tibble [10 × 1]>    10    20
#2     2 <tibble [8 × 1]>     20    30
#3     3 <tibble [0 × 1]>     30    40

注意:根据?pmap

  

对于两个参数的函数,请使用.x和.y

     

有关更多参数,请使用..1,.. 2,.. 3 e

为保持一致,我们使用..表示法,尽管.x.y应该适用于此处的前2个变量