基于其他数据框行的新列
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)]))
我想知道如何创建一个新列并使用不同数据集中相应行的信息作为该列的输入。
假设我有这两个数据集:
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)]))