如何从成对的级别组合生成数据框

How to generate data frame from pairwise combinations of levels

我想根据要共享的固定水平的因子水平组合生成数据框。我有一个工作代码如下所示,但我想概括它,以便它可以通过简单地输入以下内容来适用于任意数量的级别:数据帧 df,要拆分的变量 var1 ,要共享的级别 A,以及新变量的名称 strat。我希望能够将此功能与管道一起使用,以允许此后进行其他操作。任何帮助将不胜感激。

这是我的尝试:

var1 <- c("A", "B", "C", "A", "B", "C", "A", "B", "C", "B")
var2 <- seq(2000, 2009, 1)
var3 <- sample(1:10, 10, replace=T)
var4 <- sample(1:10, 10, replace=T)
df <- data.frame(var1, var2, var3, var4)


df2<-df %>% group_split(var1)   

dfB<-rbind(df2[[1]], df2[[2]]) %>% transform(.,
strat = "BA")

dfC<-rbind(df2[[1]], df2[[3]]) %>% transform(.,
strat = "CA")

df3<-rbind(dfB, dfC)

df3
   var1 var2 var3 var4 strat
1     A 2000    8    5    BA
2     A 2003    5    7    BA
3     A 2006    1    6    BA
4     B 2001    3    6    BA
5     B 2004    6    9    BA
6     B 2007    8   10    BA
7     B 2009    5    5    BA
8     A 2000    8    5    CA
9     A 2003    5    7    CA
10    A 2006    1    6    CA
11    C 2002    9    5    CA
12    C 2005    3    5    CA
13    C 2008    5    1    CA

这是你需要的吗?

library(dplyr)
lapply(df2[-1], function(x) rbind(df2[[1]], x)) %>% 
  lapply(function(x)  mutate(x,
    start = unique(var1) %>% 
      sort(decreasing = TRUE) %>% 
      paste(collapse = "")
  )) %>% 
  do.call(rbind, .) 


# A tibble: 13 x 5
   var1   var2  var3  var4 start
   <fct> <dbl> <int> <int> <chr>
 1 A      2000     2     6 BA   
 2 A      2003     7     7 BA   
 3 A      2006     3     4 BA   
 4 B      2001     2     3 BA   
 5 B      2004     1     1 BA   
 6 B      2007     8    10 BA   
 7 B      2009    10     4 BA   
 8 A      2000     2     6 CA   
 9 A      2003     7     7 CA   
10 A      2006     3     4 CA   
11 C      2002     8     2 CA   
12 C      2005     2     1 CA   
13 C      2008     8     8 CA  

这是另一种方法。我们根据 var1 以不同方式划分 "A" 组和 group_split,现在通过粘贴 var1first 值添加新列 strat "A".

library(dplyr)

A_df <- df %>% filter(var1 == "A")

df %>%
   filter(var1 != "A") %>%
   group_split(var1) %>%
   purrr::map_df(. %>% bind_rows(A_df) %>% mutate(strat = paste0(first(var1), "A")))


#  var1   var2  var3  var4 strat
#  <fct> <dbl> <int> <int> <chr>
# 1 B      2001     5     5 BA   
# 2 B      2004    10    10 BA   
# 3 B      2007     5     4 BA   
# 4 B      2009     9     6 BA   
# 5 A      2000     5     9 BA   
# 6 A      2003     6     2 BA   
# 7 A      2006     9     1 BA   
# 8 C      2002    10     5 CA   
# 9 C      2005     7     9 CA   
#10 C      2008     5     3 CA   
#11 A      2000     5     9 CA   
#12 A      2003     6     2 CA   
#13 A      2006     9     1 CA