Расчет комбинаций имен столбцов без дубликатов с использованием combn - PullRequest
4 голосов
/ 02 апреля 2020

У меня есть два кадра данных с 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

Есть ли способ предотвратить возникновение дубликатов в combn или post-ho c удалить дублирующиеся строки? Я мог бы удалить суффиксы, но мне нужно знать, какие столбцы являются непрерывными и категоричными для дальнейшего анализа.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы можете попробовать

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
1 голос
/ 02 апреля 2020

Вы можете использовать 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 комбинаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...