Как сгенерировать фрейм данных из попарных комбинаций уровней

Я хочу сгенерировать фрейм данных из комбинации уровней факторов с фиксированным уровнем для совместного использования. У меня есть рабочий код, показанный ниже, но я хочу обобщить его, чтобы он мог работать для любого произвольного количества уровней, просто введя в качестве входных данных следующее: фрейм данных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

2 ответа

Решение

Вот еще способ. Мы делим"A" группа по-разному и group_split на основе var1 а теперь добавляем новый столбец strat вставив first значение var1 с участием "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   

Это то, что тебе надо?

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  
Другие вопросы по тегам