根据第二个数据框中的两列在第一个数据框中添加列

Add column in first data frame based upon two columns in second data frame

我正在尝试根据第二个数据框向第一个数据框添加一列。 基本上,在数据框 1 中,我有值,这些值存在于数据框 2 中,但是我想将附加信息提取到数据框 1 中。

低于 MWE:

Class <- c("Fruit", "Fruit", "Vegetable", "Vegetable")
Food_a <- c("Apple", "Banana", "Onion", "Carrot")
dt_a <- data.frame(Class, Food_a)

dt_a
      Class Food_a
1     Fruit  Apple
2     Fruit Banana
3 Vegetable  Onion
4 Vegetable Carrot
   
Food_b <- c("Apple", "Bread", "Onion", "Banana")
dt_b <- data.frame(Food_b)

  Food_b
1  Apple
2  Bread
3  Onion
4 Banana

期望的输出:

  Food_b Class
1  Apple Fruit
2  Bread NA
3  Onion Vegetable
4 Banana Fruit

我已经查看了关于 SO 的其他问题,但我似乎无法让它们在我的示例中起作用。我能找到的最后一个是这两个: and Replace NA in column with value in adjacent column.

因为我有两个数据框,所以我不确定如何应用它。

我考虑过使用 ifelsecase_when,但我不知道如何 link 将这些 Class 这是我到目前为止的想法:

dt_c <- dt_b %>% mutate(Class=(ifelse(dt_b$Food_b %in% dt_a$Food_a, dt_a$Class, NA)))

  Food_b     Class
1  Apple     Fruit
2  Bread      <NA>
3  Onion Vegetable
4 Banana Vegetable

如果有任何帮助和建议,我将不胜感激!

当您使用 tidyverse 时,您只需要 left_join...

dt_b %>% left_join(dt_a %>% rename(Food_b = Food_a))

Joining, by = "Food_b"

  Food_b     Class
1  Apple     Fruit
2  Bread      <NA>
3  Onion Vegetable
4 Banana     Fruit

rename是为了保证每个dataframe中都有一个同名的column用于join。您还可以在 left_join 中使用 by 参数来实现相同的目的 (dt_b %>% left_join(dt_a, by = c("Food_b" = "Food_a")))。