簡體   English   中英

從兩個數據幀創建兩個變量的所有組合,同時將所有其他變量保留在 R

[英]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

您可以將Mapcbind一起使用

> 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())執行交叉連接,生成xy的所有組合。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM