基于 r 中的查找表进行合并和/或匹配

问题描述 投票:0回答:1

我有一个包含大量数据的数据框,还有一个查找/参考数据框。我想根据查找/参考数据框中找到的三个条件添加查找/参考数据框中的唯一 ID。

数据

df <- data.frame(fruit = c("mango", "strawberry", "strawberry", "apple", "mango"),
                 size = c(34, 17, 29, 10, 1),
                 var_x = c("X4", "X1", "X1a", "X1", "X1b")
)

       fruit size var_x
1      mango   34    X4
2 strawberry   17    X1
3 strawberry   29   X1a
4      apple   10    X1
5      mango    1   X1b

查找

lookup <- data.frame(unique_id = LETTERS[1:7],
                                         fruit = c("apple", "apple", "strawberry", "mango", "mango", "mango", "mango"),
                                         size = c("1:9", "1:9", "10:40", "1:100", "1:9", "1:9", "10:40"),
                                         var_x = c("c('X1', 'X1a', 'X1b')",  "X3", "c('X1', 'X1a', 'X1b')", "c('X1', 'X1a', 'X1b')", "X2", "X3","c('X1', 'X4')")
)

  unique_id      fruit  size                 var_x
1         A      apple   1:9 c('X1', 'X1a', 'X1b')
2         B      apple   1:9                    X3
3         C strawberry 10:40 c('X1', 'X1a', 'X1b')
4         D      mango 1:100 c('X1', 'X1a', 'X1b')
5         E      mango   1:9                    X2
6         F      mango   1:9                    X3
7         G      mango 10:40         c('X1', 'X4')

在查找数据框中,

size
是一个范围,
var_x
可以是一个或多个选项。

理想情况下,我尝试编写一个函数来生成以下内容,并在其中迭代每一列。如果满足所有条件,则会从查找数据框中分配适当的

unique_id

。在我的示例中,第 1 行与 
G
 匹配,因为 
fruit == "mango"
 & 
size %in% 10:40
 & 
var_x %in% c("X1", "X4")
 :

unique_id fruit size var_x 1 G mango 34 X4 2 C strawberry 17 X1 3 C strawberry 29 X1a 4 <NA> apple 10 X1 5 B apple 9 X3
基本上,我需要根据查找表进行匹配/合并,其中每个变量可能包含多个选项。我相信我需要以某种方式解析表达式然后进行评估。

r merge match lookup-tables
1个回答
0
投票
在这里,我将查找表转换为更容易使用的内容,将大小范围分为两列,并为每个

var_x

 值提供其自己的行。

library(tidyverse) lookup2 <- lookup |> separate(size, c("size_min", "size_max"), convert = TRUE) |> mutate(var_x = var_x |> str_remove_all("c\\('|'|\\)") |> str_squish()) |> separate_longer_delim(var_x, ", ")
然后它只是一个连接:(使用 dplyr 1.1.0+,用于非等值连接)

df |> left_join(lookup2, join_by(fruit, between(size, size_min, size_max), var_x))
结果

fruit size var_x unique_id size_min size_max 1 mango 34 X4 G 10 40 2 strawberry 17 X1 C 10 40 3 strawberry 29 X1a C 10 40 4 apple 10 X1 <NA> NA NA 5 mango 1 X1b D 1 100
    
© www.soinside.com 2019 - 2024. All rights reserved.