使用 combn 计算不重复的列名组合
Posted
技术标签:
【中文标题】使用 combn 计算不重复的列名组合【英文标题】:Calculating combinations of column names without duplicates using combn 【发布时间】:2020-07-14 13:01:52 【问题描述】:我有两个数据框,每个数据框有 3 列,每个数据框由不同的数据类型组成(df1 具有列名后缀为“con”的连续数据,df2 具有列名后缀为“cat”的分类数据)
我的数据:
df1 <- data.frame(t1_con=c(1:5), t2_con=c(6:10), t3_con=c(11:15))
df2 <- data.frame(t1_cat=letters[1:5], t2_cat=letters[6:10], t3_cat=letters[11:15]))
我想获取列名的所有组合,即 t1_con、t2_con、t3_cat 我试过这段代码:
df3 <- cbind(df1, df2)
results <- combn(names(df3),3,simplify=FALSE)
trait_combinations <- melt(results)
这给了我这样的组合:t1_con、t2_con、t1_cat,其中有 t1 的副本。但是,我不想要 t1、t2 或 t3 的任何重复项。例如。第 1 组很好,因为组中有 t1、t2 和 t3,但第 2 组有 t1 的副本:
head(trait_combinations)
value L1
1 t1_con 1
2 t2_con 1
3 t3_con 1
4 t1_con 2
5 t2_con 2
6 t1_cat 2
有没有办法防止在组合中发生重复,或事后删除重复的字符串?我可以删除后缀,但我需要知道哪些列是连续的和分类的,以便进一步分析。
感谢您的帮助。
【问题讨论】:
一个懒惰且低效的方法是生成所有组合,然后使用unique
函数
当我在列名上有后缀时,唯一性不起作用。但如果我把它们取下来。我已经设法获得我想要的东西的冗长方法,但理想情况下有一种更快的方法(因为这将重复 1000 次)。
这是代码:trait_combinations2 <- trait_combinations trait_combinations2$value <- sub("_[^_]+$", "", trait_combinations2$value) ## keep first values trait_combinations2 <- unique(trait_combinations2) trait_combinations2 <- trait_combinations2 %>% group_by(L1) %>% filter(n() >= ncol(trait_temp2)) trait_combinations2 <- trait_combinations2[,-1] trait_combinations3 <- match_df(trait_combinations, trait_combinations2, on = NULL)
我同意它效率低下(这就是我所说的 :-)),但我很困惑为什么它不起作用。这对我来说很好> unique(c("t1_con", "t1_con", "t1_cat")) [1] "t1_con" "t1_cat"
【参考方案1】:
你可以试试
do.call(expand.grid,
data.frame(rbind(names(df1),names(df2))))
给了
X1 X2 X3
1 t1_con t2_con t3_con
2 t1_cat t2_con t3_con
3 t1_con t2_cat t3_con
4 t1_cat t2_cat t3_con
5 t1_con t2_con t3_cat
6 t1_cat t2_con t3_cat
7 t1_con t2_cat t3_cat
8 t1_cat t2_cat t3_cat
【讨论】:
【参考方案2】:您可以使用expand.grid()
生成所有 8 种组合。
expand.grid(Map(c, names(df1), names(df2), USE.NAMES = F))
# Var1 Var2 Var3
# 1 t1_con t2_con t3_con
# 2 t1_cat t2_con t3_con
# 3 t1_con t2_cat t3_con
# 4 t1_cat t2_cat t3_con
# 5 t1_con t2_con t3_cat
# 6 t1_cat t2_con t3_cat
# 7 t1_con t2_cat t3_cat
# 8 t1_cat t2_cat t3_cat
说明
首先,使用Map
创建一个列表,表示3组候选变量:
Map(c, names(df1), names(df2), USE.NAMES = F)
[[1]]
[1] "t1_con" "t1_cat"
[[2]]
[1] "t2_con" "t2_cat"
[[3]]
[1] "t3_con" "t3_cat"
然后,expand.grid()
将从每个组中选择一个变量,从而生成所有 8 个组合。
【讨论】:
以上是关于使用 combn 计算不重复的列名组合的主要内容,如果未能解决你的问题,请参考以下文章