首页 > 解决方案 > 在组中查找最大值,按来自不同数据帧的子集查找最大值,以选择其他值

问题描述

我有两个带有原始数据的 data.frames df1。df2 包含有关在 df1 中查找位置的信息。df1 有组,由“id”定义。在这些组中,一个子集由 df2$value_a1 和 df2$value_a2 定义,它们表示要在组中查找的行范围。在该子组中,我想找到最大值 value_a,以选择 value_b。

df1 和 df2 的代码

df1 <- data.frame("id" = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), "value_a" = c(0, 10, 21, 30, 43, 53, 69, 81, 93, 5, 16, 27, 33, 45, 61, 75, 90, 2, 11, 16, 24, 31, 40, 47, 60, 75, 88), "value_b" = c(100, 101, 100, 95, 90, 104, 88, 84, 75, 110, 105, 106, 104, 95, 109, 96, 89, 104, 104, 104, 103, 106, 103, 101, 99, 98, 97), "value_c" = c(0, -1, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 1, 1, 2, 2, 1, -1, 0, 0, 1, 1, 2, 2, 1, 1, 0), "value_d" = c(1:27))
df2 <- data.frame("id" = c(1, 2, 3), "value_a1" = c(21, 33, 16), "value_a2" = c(69, 75, 60))

这是df1

   id value_a value_b value_c value_d
1   1       0     100       0       1
2   1      10     101      -1       2
3   1      21     100      -2       3
4   1      30      95      -2       4
5   1      43      90      -2       5
6   1      53     104      -2       6
7   1      69      88      -1       7
8   1      81      84      -1       8
9   1      93      75       0       9
10  2       5     110       0      10
11  2      16     105       0      11
12  2      27     106       0      12
13  2      33     104       1      13
14  2      45      95       1      14
15  2      61     109       2      15
16  2      75      96       2      16
17  2      90      89       1      17
18  3       2     104      -1      18
19  3      11     104       0      19
20  3      16     104       0      20
21  3      24     103       1      21
22  3      31     106       1      22
23  3      40     103       2      23
24  3      47     101       2      24
25  3      60      99       1      25
26  3      75      98       1      26
27  3      88      97       0      27

这是df2

  id value_a1 value_a2
1  1       21       69
2  2       33       75
3  3       16       60

我的结果是 df3,看起来像这样

  id value_a value_c
1  1      53      -2
2  2      61       2
3  3      31       1

我写了这段代码来展示我的思路。

df3 <- df1 %>%
  group_by(id) %>%
  filter(value_a >= df2$value_a1 & value_a <= df2$value_a2) %>%
  filter(value_a == max(value_a)) %>%
  pull(value_b)

然而,这会生成一个包含三个条目的值:

[1] 88 95 99

这些不是最大值_b的......

也许by()会起作用,但这会卡在两个不同的df上使用一个函数。

感觉就快到了,但还远着呢……

标签: r

解决方案


你可以试试这个。我希望这有帮助。

df1 %>% left_join(df2) %>% mutate(val=ifelse(value_a>value_a1 & value_a<value_a2,value_b,NA)) %>%
  group_by(id) %>% summarise(val=max(val,na.rm=T))

# A tibble: 3 x 2
     id   val
  <dbl> <dbl>
1     1   104
2     2   109
3     3   106

推荐阅读