Как отфильтровать элементы столбца списка - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть фрейм данных (df) с 3 переменными:

  • ID (первая переменная id)
  • ID2 (вторая переменная id)
  • data (столбец списка, созданный с помощью функции 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 голосов
/ 26 ноября 2018

Мы можем использовать map2.Мы подаем столбец списка (data) как аргумент .x, а df$ID2 как аргумент .y и фильтруем каждый .x, где .x$ID2 != .y:

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
...