[英]Create all combinations of two variables from two dataframes while keeping all other variables in R
我在兩個數據框中有最小數據,並且正在尋找兩個變量的所有組合,每個變量都在一個數據框中。 這可以通過expand.grid()
來實現。 是否有 function 來保留兩個數據幀中的所有其他變量?
df1 <- data.frame(var1 = c("A", "B", "C"), var2 = c(1,2,3))
df2 <- data.frame(var1 = c("D", "E", "F"), var2 = c(4,5,6))
expand.grid(df1$var1, df2$var1)
Var1 Var2
1 A D
2 B D
3 C D
4 A E
5 B E
6 C E
7 A F
8 B F
9 C F
預期結果是所有組合和所有其他變量,可能帶有后綴。
Var1.x Var1.y var2.x var2.y
1 A D 1 4
2 B D 2 4
3 C D 3 4
4 A E 1 5
5 B E 2 5
6 C E 3 5
7 A F 1 6
8 B F 2 6
9 C F 3 6
您可以將Map
與cbind
一起使用
> do.call(cbind, Map(function(x, y) expand.grid(x = x, y = y), df1, df2))
var1.x var1.y var2.x var2.y
1 A D 1 4
2 B D 2 4
3 C D 3 4
4 A E 1 5
5 B E 2 5
6 C E 3 5
7 A F 1 6
8 B F 2 6
9 C F 3 6
這是否有效:
library(dplyr)
library(tidyr)
df1 %>% uncount(3) %>% cbind(df2 %>% uncount(3)) %>%
setNames(., c('Var1.x', 'Var2.x', 'Var1.y', 'Var2.y'))
Var1.x Var2.x Var1.y Var2.y
1 A 1 D 4
2 A 1 D 4
3 A 1 D 4
4 B 2 E 5
5 B 2 E 5
6 B 2 E 5
7 C 3 F 6
8 C 3 F 6
9 C 3 F 6
使用dplyr
,您可以使用full_join(x, y, by = character())
執行交叉連接,生成x
和y
的所有組合。
library(dplyr)
full_join(df1, df2, by = character())
# var1.x var2.x var1.y var2.y
# 1 A 1 D 4
# 2 A 1 E 5
# 3 A 1 F 6
# 4 B 2 D 4
# 5 B 2 E 5
# 6 B 2 F 6
# 7 C 3 D 4
# 8 C 3 E 5
# 9 C 3 F 6
另一種方法是來自 tidyr 的tibble
expand_grid()
或crossing()
以從所有輸入組合創建一個tidyr
。
library(tidyr)
crossing(df1, df2, .name_repair = ~ paste0(.x, rep(c('.x', '.y'), each = 2)))
crossing()
是對expand_grid()
的包裝器,用於對其輸入進行重復數據刪除和排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.