繁体   English   中英

将 dataframe 中的一列与另一 dataframe 的两列进行比较

[英]Compare one column in a dataframe to two columns of another dataframe

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

我之前对其他两个数据框做了类似的事情,我使用了嵌套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
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")

这是一个更通用的解决方案,适用于数据,无论有多少data[n]

library('dplyr')
library('tidyr')

# Make dataframes tidy
Df1_tidy <- Df1 %>%   
    gather(key='data_name', value='value', -(id:type))

Df2_tidy <- Df2 %>%
    gather(key='data_name', value='value', -type) %>%
    mutate(limit=ifelse(grepl('max', data_name), 'Max', 'Min'),
           data_name=gsub('max', '', data_name)) %>% 
    spread(limit, value) 

# Count qualifying fields
Df3 <- full_join(Df1_tidy, Df2_tidy) %>%
    group_by(id, type) %>%
    summarise(qualifyingfields = sum(value >= Min & value <= Max, na.rm=T)) %>%
    ungroup()

Df3
# # A tibble: 23 x 3
#       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

获取数据(从@M--响应复制):

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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM