首页 > 解决方案 > 将数据框中的一列与另一个数据框中的两列进行比较

问题描述

我有两个数据帧,我需要知道第一个数据帧的值是否在第二个数据帧的两个值(最小值和最大值)之间。

我之前对其他两个数据框做了类似的事情,我使用了嵌套的loopbetween {dplyr}. 然而,另一个数据集只有三个变量,我可以使它与 8 个if语句一起工作。这就是我卡住的地方,dataframe1 有 62 个变量和 477 个观察值,而 dataframe2 有 124 个变量和 50 个观察值(最小值和最大值)。下面我有两个数据框的示例以及我正在寻找的结果。

所以我正在寻找一个解决方案,我不必写大约一千条if else语句。我希望有人可以提供帮助,或者如果这可能的话。

数据看起来如何的示例,我仍然可以更改数据框,但这就是我所处的位置。

Df1
   id type data1 data2 data3
1   1   ab     0     0     0
2   2   cd     0     0     0
3   3   dd     0    10     5
4   4   ed     0     0     0
5   5   kd     0     0    15
6   6   xd     0     5     0
7   7   ab     0     0     0
8   8   cd     0     0     0
9   9   dd     0    10    10
10 10   ed     0     0     0
11 11   kd     0     0    12
12 12   xd     0    12     0
13 13   ab     0     0     0
14 14   cd     0     0     0
15 15   dd     0     5    15
16 16   ed     0     0     0
17 17   kd     0     0    15
18 18   xd     0     7     0
19 19   ab     0     0     0
20 20   cd     0     0     0
21 21   dd     0    18    10
22 22   ed     0     0     0
23 23   kd     0     0     5

我通常将“类型”相互匹配,然后匹配数据是否在下边界和上边界之间。

Df2
  type data1 data1max data2 data2max data3 data3max
1   ab    NA       NA    NA       NA    NA       NA
2   dd    NA       NA     5       20    10      100
3   xd    NA       NA     1       30    NA       NA
4   ed    NA       NA    NA       NA    NA       NA
5   cd    NA       NA    NA       NA    NA       NA
6   kd    NA       NA    NA       NA     5       20

并在观察到的数据与合格数据匹配时产生计数。

Df3
   id type qualifyingfields
1   1   ab                0
2   2   cd                0
3   3   dd                1
4   4   ed                0
5   5   kd                1
6   6   xd                1
7   7   ab                0
8   8   cd                0
9   9   dd                2
10 10   ed                0
11 11   kd                1
12 12   xd                1
13 13   ab                0
14 14   cd                0
15 15   dd                2
16 16   ed                0
17 17   kd                1
18 18   xd                1
19 19   ab                0
20 20   cd                0
21 21   dd                1
22 22   ed                0
23 23   kd                1

标签: rdataframe

解决方案


library(dplyr)
library(tidyr)

df1 %>% 
  right_join(., df2, by = "type", suffix = c("val", "min")) %>% 
  group_by(type, id) %>% 
  pivot_longer(-c(id, type), names_to = "data", values_to = "value") %>% 
  separate(col = data, into = c("data", "var"), sep = "(?<=\\d)") %>% 
  pivot_wider(names_from = var, values_from = value) %>% 
  group_by(id, type, data) %>% 
  mutate(qualifyingfields = sum(between(val, min, max), na.rm = T)) %>% 
  group_by(id, type) %>% 
  summarise(qualifyingfields = sum(qualifyingfields))

#> # A tibble: 23 x 3
#> # Groups:   type, id [23]
#>       id type  qualifyingfields
#>    <int> <chr>            <int>
#>  1     1 ab                   0
#>  2     2 cd                   0
#>  3     3 dd                   1
#>  4     4 ed                   0
#>  5     5 kd                   1
#>  6     6 xd                   1
#>  7     7 ab                   0
#>  8     8 cd                   0
#>  9     9 dd                   2
#> 10    10 ed                   0
#> # ... with 13 more rows

数据:

df1 <- read.table(text="   id type data1 data2 data3
1   1   ab     0     0     0
2   2   cd     0     0     0
3   3   dd     0    10     5
4   4   ed     0     0     0
5   5   kd     0     0    15
6   6   xd     0     5     0
7   7   ab     0     0     0
8   8   cd     0     0     0
9   9   dd     0    10    10
10 10   ed     0     0     0
11 11   kd     0     0    12
12 12   xd     0    12     0
13 13   ab     0     0     0
14 14   cd     0     0     0
15 15   dd     0     5    15
16 16   ed     0     0     0
17 17   kd     0     0    15
18 18   xd     0     7     0
19 19   ab     0     0     0
20 20   cd     0     0     0
21 21   dd     0    18    10
22 22   ed     0     0     0
23 23   kd     0     0     5", 
header=T, stringsAsFactors=F)

df2 <- read.table(text="  type data1 data1max data2 data2max data3 data3max
1   ab    NA       NA    NA       NA    NA       NA
2   dd    NA       NA     5       20    10      100
3   xd    NA       NA     1       30    NA       NA
4   ed    NA       NA    NA       NA    NA       NA
5   cd    NA       NA    NA       NA    NA       NA
6   kd    NA       NA    NA       NA     5       20", 
header=T, stringsAsFactors=F, na.strings = "NA")

推荐阅读