Left_join 条件下

Left_join under condition

我有 2 个数据框,我需要根据条件合并它们:

```
# Dataframe 1
plant1 <- c("FF",  "DO")
loc1 <- c("MM",  "KB")
df1 <-  data.frame(plant1,  loc1)
df1

  plant1  loc1
1    FF    MM
2    DO    KB

# Dataframe 2
plant2 <- c("FF",  "DO","DO")
loc2 <- c("MM",  "KB","KB")
name <- c("name_1",  "name_2","name_3")
frequency <- c(1, 2, 2)

df2 <-  data.frame(plant2,  loc2, name, frequency)
df2

      plant2 loc2   name      frequency
1     FF     MM     name_1         1
2     DO     KB     name_2         2
3     DO     KB     name_3         2

```

我需要将 name 的值从 df2 带到 df1 值,仅适用于 frequency == 1 的情况, 对于其余情况,我需要设置特定文本。

这是我需要得到的结果:

  plant3  loc3    name3
1   FF     MM     name_1
2   DO     KB     multiple

我从最简单的代码开始,我需要在其中添加条件:

df1 %>% left_join(df2, by=c("plant1" = "plant2", "loc1" = "loc2" ))

当然,我可以通过简单的 left_join 以“肮脏”的方式做到这一点,然后将 name 列中的值替换为 frequency !=1 并添加 unique() .

有没有更优雅的方式?

我正在查看此主题的讨论,但无法将其应用于我的案例:

https://community.rstudio.com/t/how-can-i-join-two-tables-with-an-or-statement-in-r-using-dplyrs-join-functions/37633

这里有一个 data.table 的可能性...

library(data.table)
# Make them data.tables
setDT(df1);setDT(df2)
# Set key for join
setkey(df1, plant1, loc1)
setkey(df2, plant2, loc2)
# Join
df2[df1, .(name3 = if (.N > 1) "multiple" else x.name), by = .EACHI][]
#    plant2 loc2    name3
# 1:     DO   KB multiple
# 2:     FF   MM   name_1