4

我有两个数据框,每个数据框有 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

有没有办法防止在组合中发生重复,或者事后删除重复的字符串?我可以删除后缀,但我需要知道哪些列是连续的和分类的,以便进一步分析。

谢谢你的帮助。

4

2 回答 2

1

您可以使用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 个组合。

于 2020-04-02T14:28:03.620 回答
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
于 2020-04-02T14:49:32.100 回答