Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 通过另一个数据帧中的条件过滤一个数据帧_R_Dplyr_Tidyverse - Fatal编程技术网

R 通过另一个数据帧中的条件过滤一个数据帧

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,

我想通过在另一个数据帧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 <= 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