我有一个包含大量数据的数据框,还有一个查找/参考数据框。我想根据查找/参考数据框中找到的三个条件添加查找/参考数据框中的唯一 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
基本上,我需要根据查找表进行匹配/合并,其中每个变量可能包含多个选项。我相信我需要以某种方式解析表达式然后进行评估。
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