R 通过另一个数据帧中的条件过滤一个数据帧
我想通过在另一个数据帧z中表示为行的任意数量的条件递归地过滤一个数据帧d 我从数据帧d开始: 我想返回d的所有行,其中d$x=z$x2[I]代表所有I,其中I=nrowz 因此,对于这个玩具示例,排除1:1、3:4、8:10(包括1:1、3:4、8:10)中的所有内容R 通过另一个数据帧中的条件过滤一个数据帧,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我想通过在另一个数据帧z中表示为行的任意数量的条件递归地过滤一个数据帧d 我从数据帧d开始: 我想返回d的所有行,其中d$x=z$x2[I]代表所有I,其中I=nrowz 因此,对于这个玩具示例,排除1:1、3:4、8:10(包括1:1、3:4、8:10)中的所有内容 x y 2 2 b 5 5 e 6 6 f 7 7 g 我们可以使用非等联接 library(data.table) i1 <- setDT(d)[z, .I, on = .(x >=x1,
x y
2 2 b
5 5 e
6 6 f
7 7 g
我们可以使用非等联接
library(data.table)
i1 <- setDT(d)[z, .I, on = .(x >=x1, x <= x2), by = .EACHI]$I
i1
#[1] 1 3 4 8 9 10
d[i1]
# x y
#1: 1 a
#2: 3 c
#3: 4 d
#4: 8 h
#5: 9 i
#6: 10 j
d[!i1]
# x y
#1: 2 b
#2: 5 e
#3: 6 f
#4: 7 g
或者从“d”中获取不在“x”中的行
fuzzy_anti_join(d, z, by = c('x' = 'x1', 'x' = 'x2'),
match_fun = list(`>=`, `<=`)) %>%
select(names(d))
# A tibble: 4 x 2
# x y
# <int> <fct>
#1 2 b
#2 5 e
#3 6 f
#4 7 g
我们可以在x1和x2值之间创建一个序列,并使用anti_join从d中选择z中不存在的行
为什么包括x=2?它与您的约束不匹配。它与约束匹配。z中的每一行都是一对约束。所以排除1:1、3:4、8:10(包括1:1、3:4、8:10)中的所有内容。那么您的最后一帧是要排除的行?对不起,我一定错过了。嗯,你说得很对。我可以在问题陈述中更清楚地说明这一点。您所说的是一个非等联接,而目前在R中有效地实现这一点的唯一方法是使用data.table。我认为akrun正试图为您找到一个好的解决方案。非等联接方法有效,但模糊联接并不能完全返回预期结果。@RichPauloo我展示了两种方法,它们都对我有效。@RichPauloo无论如何,如果您只提到了基于tidyverse的方法,可以创建它。Th@RichPauloo如果你的意思是反对加入,那就是模糊反对加入。无论如何
library(data.table)
i1 <- setDT(d)[z, .I, on = .(x >=x1, x <= x2), by = .EACHI]$I
i1
#[1] 1 3 4 8 9 10
d[i1]
# x y
#1: 1 a
#2: 3 c
#3: 4 d
#4: 8 h
#5: 9 i
#6: 10 j
d[!i1]
# x y
#1: 2 b
#2: 5 e
#3: 6 f
#4: 7 g
library(fuzzyjoin)
library(dplyr)
fuzzy_inner_join(d, z, by = c('x' = 'x1', 'x' = 'x2'),
match_fun = list(`>=`, `<=`)) %>%
select(names(d))
# A tibble: 6 x 2
# x y
# <int> <fct>
#1 1 a
#2 3 c
#3 4 d
#4 8 h
#5 9 i
#6 10 j
fuzzy_anti_join(d, z, by = c('x' = 'x1', 'x' = 'x2'),
match_fun = list(`>=`, `<=`)) %>%
select(names(d))
# A tibble: 4 x 2
# x y
# <int> <fct>
#1 2 b
#2 5 e
#3 6 f
#4 7 g
library(tidyverse)
remove <- z %>%
mutate(x = map2(x1, x2, seq)) %>%
unnest(x) %>%
select(x)
anti_join(d, remove)
# x y
#1 2 b
#2 5 e
#3 6 f
#4 7 g