使用dplyr基于另一个数据集的范围值从数据集中过滤分组变量

vwkv1x7d  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(100)

我想取一个(大)数据框的值:

library(tidyverse)
df.grid = expand.grid(x = letters, y = 1:60)
head(df.grid)

  x y
1 a 1
2 b 1
3 c 1
4 d 1
5 e 1
6 f 1
[...]

最终到达a 2a 3,等等。
我有第二个数据框,其中包含一些变量(x),我只需要范围(最小值和最大值)的一部分,每个“x”个变量都不同

sub.data = data.frame(x = c("a","c","d"), min = c(2,50,25), max = c(6,53,30))

sub.data
  x min max
1 a   2   6
2 c  50  53
3 d  25  30

输出应如下所示:

x       y
1    a       2
2    a       3
3    a       4
4    a       5
5    a       6
6    c      50
7    c      51
8    c      52
9    c      53
10   d      25
11   d      26
12   d      27
13   d      28
14   d      29
15   d      30

我试过这个:

df.grid %>% 
  group_by(x) %>% 
  filter_if(y > sub.data$min)

但它不起作用,因为min列有多个值,“if”部分会抱怨。
我也使用found this post,但它似乎对我不起作用,因为没有“匹配”变量来指导过滤过程。
我希望避免使用for循环,因为我希望将其应用于大小为11GB的 Dataframe 。

ih99xse1

ih99xse11#

我们可以使用非相等连接

library(data.table)
setDT(df.grid)[, y1 := y][sub.data, .(x, y), on = .(x, y1 >= min, y1 <= max)]
  • 输出
x  y
 1: a  2
 2: a  3
 3: a  4
 4: a  5
 5: a  6
 6: c 50
 7: c 51
 8: c 52
 9: c 53
10: d 25
11: d 26
12: d 27
13: d 28
14: d 29
15: d 30

对于dplyr版本1.1.0,我们还可以将non-equi连接与join_by一起使用

library(dplyr)
inner_join(df.grid, sub.data, by = join_by(x, y >= min , y <= max)) %>%
    select(x, y)
  • 输出
x  y
1  a  2
2  a  3
3  a  4
4  a  5
5  a  6
6  d 25
7  d 26
8  d 27
9  d 28
10 d 29
11 d 30
12 c 50
13 c 51
14 c 52
15 c 53

或者,正如@Davis Vaughan提到的,将betweenleft_joion一起使用

left_join(sub.data, df.grid, by = join_by(x, between(y$y, x$min, 
     x$max))) %>%
    select(names(df.grid))

相关问题