如何从成对的级别组合生成数据框
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
,现在通过粘贴 var1
的 first
值添加新列 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
我想根据要共享的固定水平的因子水平组合生成数据框。我有一个工作代码如下所示,但我想概括它,以便它可以通过简单地输入以下内容来适用于任意数量的级别:数据帧 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
,现在通过粘贴 var1
的 first
值添加新列 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