如何过滤列表列的元素

时间:2018-11-26 15:14:42

标签: r list filter purrr

我有一个带有3个变量的数据框(df):

  • ID(第一个id变量)
  • ID2(第二个ID变量)
  • 数据(使用tidyr :: nest()函数创建的列表列。

    library(tidyverse)
    library(lubridate)
    
    dates <- ymd(c('2018-02-01', '2018-02-06', '2018-02-10', 
                   '2018-02-21', '2018-04-05'))
    df.1 <- tibble(ID = paste0('ID_', rep(1, 5)),
               ID2 = LETTERS[1:5],
               DATE = dates) %>%
               group_by(ID) %>% 
               nest()
    
    
     df.2 <- tibble(ID = paste0('ID_', rep(1, 6)),
               ID2 = LETTERS[1:6])
    
    
     df <- df.1 %>%
     left_join(df.2, by = 'ID')
    

列表列(数据)包含2个变量:

  • ID2
  • 日期

我想将data[[DATE]]的所有元素保留在列表列(data[[ID2]] != df$ID2)中。

是否有任何方法可以应用过滤器功能-可能是purrr软件包的方法?

非常感谢!

1 个答案:

答案 0 :(得分:3)

我们可以使用map2。我们将列表列(data)作为.x参数,将df$ID2作为.y参数,并在每个.x上进行过滤,其中.x$ID2 != .y:< / p>

library(tidyverse)

output <- df %>%
  mutate(data = data %>% map2(ID2, ~ filter(.x, ID2 != .y))) 

输出:

> output
# A tibble: 6 x 3
  ID    data             ID2  
  <chr> <list>           <chr>
1 ID_1  <tibble [4 x 2]> A    
2 ID_1  <tibble [4 x 2]> B    
3 ID_1  <tibble [4 x 2]> C    
4 ID_1  <tibble [4 x 2]> D    
5 ID_1  <tibble [4 x 2]> E    
6 ID_1  <tibble [5 x 2]> F  

> output %>%
+   pull(data)
[[1]]
# A tibble: 4 x 2
  ID2   DATE      
  <chr> <date>    
1 B     2018-02-06
2 C     2018-02-10
3 D     2018-02-21
4 E     2018-04-05

[[2]]
# A tibble: 4 x 2
  ID2   DATE      
  <chr> <date>    
1 A     2018-02-01
2 C     2018-02-10
3 D     2018-02-21
4 E     2018-04-05

[[3]]
# A tibble: 4 x 2
  ID2   DATE      
  <chr> <date>    
1 A     2018-02-01
2 B     2018-02-06
3 D     2018-02-21
4 E     2018-04-05

[[4]]
# A tibble: 4 x 2
  ID2   DATE      
  <chr> <date>    
1 A     2018-02-01
2 B     2018-02-06
3 C     2018-02-10
4 E     2018-04-05

[[5]]
# A tibble: 4 x 2
  ID2   DATE      
  <chr> <date>    
1 A     2018-02-01
2 B     2018-02-06
3 C     2018-02-10
4 D     2018-02-21

[[6]]
# A tibble: 5 x 2
  ID2   DATE      
  <chr> <date>    
1 A     2018-02-01
2 B     2018-02-06
3 C     2018-02-10
4 D     2018-02-21
5 E     2018-04-05