r - 将数据框中的一列与另一个数据框中的两列进行比较
问题描述
我有两个数据帧,我需要知道第一个数据帧的值是否在第二个数据帧的两个值(最小值和最大值)之间。
我之前对其他两个数据框做了类似的事情,我使用了嵌套的loop
和between {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
解决方案
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")
推荐阅读
- angular - 角度和评估:我得到一个环境错误
- javascript - 如何更改选中复选框的父元素的样式
- react-native - 我应该将 onBackPressureBuffer(n) 放在 RxJava 订阅链的哪个位置?
- jquery - jQuery "this" apparently not selecting unique instance
- r - R:根据其他两列的匹配替换列
- sql - 通过 VPN 看不到 SQL 视图,但可以看到表
- mysql - MySQL 错误 - ALTER 在此位置无效
- linux - Ansible 中的全局修改 $PATH 无法在常规 Linux shell 中按预期工作
- vue.js - 如何在 VueJS 中监听一个组件的所有事件?
- java - 不推荐使用 HTTPUtils .. 我该怎么做?