我有一个带有3个变量的数据框(df):
数据(使用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个变量:
我想将data[[DATE]]
的所有元素保留在列表列(data[[ID2]] != df$ID2
)中。
是否有任何方法可以应用过滤器功能-可能是purrr软件包的方法?
非常感谢!
答案 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