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