【问题标题】:Left_join under conditionLeft_join 条件下
【发布时间】:2021-05-05 14:31:33
【问题描述】:

我有 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

【问题讨论】:

    标签: r conditional-statements left-join


    【解决方案1】:

    这是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
    

    【讨论】:

    • 嗨@Wimpel,这是一个有趣的解决方案,我还没有在实践中使用它,但是我有一个错误:Error in [.data.table(df2, df1, .(name3 = if (.N &gt; 1) "multiple" else x.name), : Column 1 of result for group 2 is type 'integer' but expecting type 'character'. Column types must be consistent for each group.我不知道如何解决它。 typeof frequency 为 double,其余列均为字符。
    猜你喜欢
    • 2022-09-23
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多