基于其他数据框行的新列

New column based on rows of other dataframe

我想知道如何创建一个新列并使用不同数据集中相应行的信息作为该列的输入。

假设我有这两个数据集:

newDf <- data.frame(c("Juice 1", "Juice 2", "Juice 3", "Juice 4","Juice 5"),
                    c("Banana", "Banana", "Orange", "Pear", "Apple"),
                    c("Pear", "Orange", "Pear", "Apple", "Pear"),
                    c("Orange", "Mango", "Banana", "Banana", "Banana"))
colnames(newDf) <- c("Juice", "Fruit 1", "Fruit 2", "Fruit 3")

newDf2 <- data.frame(c("Juice 6", "Juice 3", "Juice 2", "Juice 8","Juice 1"),
                     c(NA,NA,NA,NA,NA),
                     c(NA,NA,NA,NA,NA),
                     c(NA,NA,NA,NA,NA))
colnames(newDf2) <- c("Juice", "Fruit 1", "Fruit 2", "Fruit 3")

导致:

> print(newDf)
    Juice Fruit 1 Fruit 2 Fruit 3
1 Juice 1  Banana    Pear  Orange
2 Juice 2  Banana  Orange   Mango
3 Juice 3  Orange    Pear  Banana
4 Juice 4    Pear   Apple  Banana
5 Juice 5   Apple    Pear  Banana

> print(newDf2)
    Juice Fruit 1 Fruit 2 Fruit 3
1 Juice 6      NA      NA      NA
2 Juice 3      NA      NA      NA
3 Juice 2      NA      NA      NA
4 Juice 8      NA      NA      NA
5 Juice 1      NA      NA      NA

在我的newDf2中,我想分配来自newDf的水果。但是,正如您所看到的,第一列中的 Juices 的顺序并不相同,因此我必须根据 Juice 进行分配。

我想达到这个结果:

    Juice Fruit 1 Fruit 2 Fruit 3
1 Juice 6      NA      NA      NA
2 Juice 3  Orange    Pear  Banana
3 Juice 2  Banana  Orange   Mango
4 Juice 8      NA      NA      NA
5 Juice 1  Banana    Pear  Orange

有人可以帮我解决这个问题吗?

谢谢!

编辑:

在我的实际数据集中,列并非都以 Fruit 开头...所以它们都有不同的名称。你能帮我找到一个解决方案,它适用于每个总列名,而不是仅以 'Fruit' 开头的解决方案吗?

我们可以在 across 中使用 match - 循环 across 'Fruit' 'newDf2' 中的列,match 'Juice' 来自 'newDf' 的列值,使用该索引从 'newDf`[=21= 中提取相应列的值(cur_column() - returns 循环列的列名) ]

library(dplyr)
newDf2 <- newDf2 %>% 
  mutate(across(starts_with('Fruit'), 
       ~ newDf[[cur_column()]][match(Juice, newDf$Juice)]))

-输出

newDf2
  Juice Fruit 1 Fruit 2 Fruit 3
1 Juice 6    <NA>    <NA>    <NA>
2 Juice 3  Orange    Pear  Banana
3 Juice 2  Banana  Orange   Mango
4 Juice 8    <NA>    <NA>    <NA>
5 Juice 1  Banana    Pear  Orange

如果列名没有任何模式,则使用列索引。假设两个数据集中的第一列都是 Juice,用 -1

排除 across 中的那一列
newDf2 <- newDf2 %>% 
  mutate(across(-1, 
       ~ newDf[[cur_column()]][match(Juice, newDf$Juice)]))