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()
.
有没有更优雅的方式?
我正在查看此主题的讨论,但无法将其应用于我的案例:
这里有一个 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
我有 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()
.
有没有更优雅的方式?
我正在查看此主题的讨论,但无法将其应用于我的案例:
这里有一个 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