我有一个 Dataframe a
、b
和c
的列表。我希望最后得到一个列表,其中a
不会更改,b
仅包含不在a
中的行,c
仅包含不在b
中的行。
# Sample data
a <- data.frame(num = 1:4, let = letters[1:4])
b <- data.frame(num = 2:6, let = letters[2:6])
c <- data.frame(num = 3:8, let = letters[3:8])
dfs <- list(a, b, c)
让我感到困惑的是我需要在 original previous Dataframe 上执行anti-join,而不是在对它的previous Dataframe 执行anti-join之后创建的 Dataframe 。我的直觉是使用purrr
中的accumulate
来完成这个任务,但是我不知道如何让它在original previous Dataframe 上工作。
dfs |>
accumulate(~anti_join(.y, .x))
[[1]]
num let
1 1 a
2 2 b
3 3 c
4 4 d
[[2]]
num let
1 5 e
2 6 f
[[3]]
num let
1 4 d
2 7 g
3 8 h
由于这个连接在已经连接的前一个 Dataframe 上,所以我在第三个df中有我不想要的4 d
。
我尝试过.dir = "backward"
作为使用原始dfs进行加入的一种方式,但这并没有做我认为它应该做的事情:
dfs |>
accumulate(~anti_join(.y, .x), .dir = "backward")
[[1]]
num let
1 7 g
2 8 h
[[2]]
num let
1 7 g
2 8 h
[[3]]
num let
1 4 d
2 5 e
3 6 f
4 7 g
5 8 h
有没有办法设置accumulate
的参数,这样它就可以做到这一点,或者我需要一个不同的方法?如果可能的话,我更喜欢purrr/tidyverse,但我愿意接受任何能满足我需要的东西。
预期产出:
[[1]]
num let
1 1 a
2 2 b
3 3 c
4 4 d
[[2]]
num let
1 5 e
2 6 f
[[3]]
num let
1 7 g
2 8 h
2条答案
按热度按时间crcmnpdw1#
您可以使用
accumulate2
来实现滚动anti_join
。wribegjk2#
**编辑:**使用
map2
:accumulate
用于动态排序,这里需要一个锚点df[[1]]
和一个函数来应用于列表的其余元素: